Seam Carving
题意:一个m*n的矩阵,每个方格有一个数,求出一条路径使得由第一层到最底层和最小;
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int dp[110][110], path[110][110], ans[110];
int main(){
int T, cas=0;
scanf("%d", &T);
while(T--){
cas++;
int m, n;
scanf("%d%d", &m, &n);
memset(dp, 0, sizeof(dp));
for(int i=0; i<=m; i++){
dp[i][0]=dp[i][n+1]=INF;
}
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
scanf("%d", &dp[i][j]);
}
}
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
int temp=dp[i-1][j-1];
path[i][j]=j-1;
if(dp[i-1][j]<=temp){
temp=dp[i-1][j];
path[i][j]=j;
}
if(dp[i-1][j+1]<=temp){
temp=dp[i-1][j+1];
path[i][j]=j+1;
}
dp[i][j]+=temp;
}
}
printf("Case %d\n", cas);
int t, minn=INF;
for(int i=1; i<=n; i++){
if(dp[m][i]<=minn){
minn=dp[m][i];
t=i;
}
}
ans[0]=t;
int j=1;
for(int i=m; i>1; i--){
t=path[i][t];
ans[j++]=t;
}
for(int i=j-1; i>=0; i--){
printf("%d%c", ans[i], i==0?'\n':' ');
}
}
return 0;
}