hdu 5902 Seam Carving

水题,直接上代码了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<set>
 7 #include<map>
 8 #include<queue>
 9 #include<stack>
10 #include<string>
11 #include<vector>
12 #define maxn
13 #define INF 1000000000
14 using namespace std;
15 int t,m,n;
16 int dp[110][110],fa[110][110],num[110][110];
17 void print(int x,int y)
18 {
19     if(x==1)
20     {
21         printf("%d ",y);
22         return ;
23     }
24 
25     print(x-1,fa[x][y]);
26     if(x==m)
27       printf("%d",y);
28     else
29        printf("%d ",y);
30 }
31 int main()
32 {
33     scanf("%d",&t);
34     for(int ii=1;ii<=t;ii++)
35     {
36         scanf("%d %d",&m,&n);
37         for(int i=1;i<=m;i++)
38             for(int j=1;j<=n;j++)
39               scanf("%d",&num[i][j]);
40         for(int i=0;i<=m+1;i++)
41             for(int j=0;j<=n+1;j++)
42               dp[i][j]=INF;
43         for(int j=1;j<=n;j++)
44             dp[1][j]=num[1][j],fa[1][j]=j;
45         for(int i=2;i<=m;i++)
46         {
47           for(int j=1;j<=n;j++)
48           {
49               for(int k=1;k>=-1;k--)
50               {
51                   if(dp[i][j]>num[i][j]+dp[i-1][j+k])
52                   {
53                       dp[i][j]=num[i][j]+dp[i-1][j+k];
54                       fa[i][j]=j+k;
55                   }
56               }              //printf("%d ",dp[i][j]);
57           }
58         }
59 
60         int ans_max=INF;
61         int flag;
62         for(int j=n;j>=1;j--)
63         {
64            
65             if(dp[m][j]<ans_max)
66             {
67                 ans_max=dp[m][j];
68                 flag=j;
69             }
70         }
71         printf("Case %d\n",ii);
72         print(m,flag);
73         printf("\n");
74     }
75     return 0;
76 }

 

posted on 2015-05-01 00:24  tsw123  阅读(287)  评论(0编辑  收藏  举报

导航