hdu2513区间动规

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define INF 1000000000
 4 int hash[45][45][45][45],judge[45][45][45][45],map[45][45],m,n;
 5 int dp(int i,int j,int h,int w)
 6 {
 7     int sum1,sum2,w0,h0;
 8     if (hash[i][j][h][w]!=0) return(hash[i][j][h][w]);
 9     sum1=sum2=INF;
10     for (w0=1;w0<w;w0++)
11     {
12         if (judge[i][j][h][w0]==1&&judge[i][j+w0][h][w-w0]==1&&(dp(i,j,h,w0)+dp(i,j+w0,h,w-w0)+h)<sum1)
13          sum1=dp(i,j,h,w0)+dp(i,j+w0,h,w-w0)+h;
14     }
15     for (h0=1;h0<h;h0++)
16     {
17         if (judge[i][j][h0][w]==1&&judge[i+h0][j][h-h0][w]==1&&(dp(i,j,h0,w)+dp(i+h0,j,h-h0,w)+w)<sum2)
18          sum2=dp(i,j,h0,w)+dp(i+h0,j,h-h0,w)+w;
19     }
20     if (sum1==sum2&&sum1==INF) hash[i][j][h][w]=0;
21     else if (sum1<sum2) hash[i][j][h][w]=sum1;
22     else hash[i][j][h][w]=sum2;
23     return(hash[i][j][h][w]);
24 }
25 int main()
26 {
27     int k,i,j,h,w,x,y,f=0;
28     while (~scanf("%d%d%d",&n,&m,&k))
29     {
30         memset(map,0,sizeof(map));
31         for (i=1;i<=k;i++)
32         {
33             scanf("%d%d",&x,&y);
34             map[x][y]=1;
35         }
36         memset(hash,0,sizeof(hash));
37         memset(judge,0,sizeof(judge));
38         for (i=1;i<=n;i++)
39          for (j=1;j<=m;j++)
40           for (h=1;h<=n;h++)
41            for (w=1;w<=m;w++)
42            if (map[i+h-1][j+w-1]==1||judge[i][j][h][w-1]==1||judge[i][j][h-1][w]==1) judge[i][j][h][w]=1;
43         f++;
44         printf("Case %d: %d\n",f,dp(1,1,n,m));
45     }
46     return 0;
47 }

http://acm.hdu.edu.cn/showproblem.php?pid=2513

posted on 2014-07-16 14:46  xiao_xin  阅读(154)  评论(0)    收藏  举报

导航