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 }