#include<iostream>
#include<cstdio>
using namespace std;
#define INF 0xfffffff
int s[110][110];
int dp[110][110];
int path[110][110];
int m,n;
void print(int i,int j)
{
if(i<0) return;
if(path[i][j]==-1)
{
cout<<j+1<<' ';
return ;
}
else
{
print(i-1,path[i][j]);//递归上一行的行标,列标
cout<<j+1; //输出当前列标
if(i!=m-1) cout<<' ';
}
}
int main()
{
int t;
cin>>t;
int cnt=0;
while(t--)
{
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
cin>>s[i][j];
dp[i][j]=INF;
path[i][j]=-1;//记录i-1行的列标
}
for(int i=0;i<n;i++)
dp[0][i]=s[0][i];
for(int i=1;i<m;i++)
for(int j=0;j<n;j++)
{
if(j<n-1&&dp[i][j]>dp[i-1][j+1]+s[i][j]) //先从最右边的开始dp
{
dp[i][j]=dp[i-1][j+1]+s[i][j];
path[i][j]=j+1;
}
if(dp[i][j]>dp[i-1][j]+s[i][j])
{
dp[i][j]=dp[i-1][j]+s[i][j];
path[i][j]=j;
}
if(j>=1&&dp[i][j]>dp[i-1][j-1]+s[i][j])
{
dp[i][j]=dp[i-1][j-1]+s[i][j];
path[i][j]=j-1;
}
}
int ans=INF,ansj;
for(int j=0;j<n;j++)
{
if(dp[m-1][j]<=ans)
{
ans=dp[m-1][j];
ansj=j;
}
}
printf("Case %d\n",++cnt);
print(m-1,ansj);
cout<<endl;
}
}
hdu5092
最新推荐文章于 2018-07-16 19:52:27 发布