hdu 5902 Seam Carving

时间:2023-03-09 07:04:28
hdu 5902 Seam Carving

水题,直接上代码了

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#define maxn
#define INF 1000000000
using namespace std;
int t,m,n;
int dp[][],fa[][],num[][];
void print(int x,int y)
{
if(x==)
{
printf("%d ",y);
return ;
} print(x-,fa[x][y]);
if(x==m)
printf("%d",y);
else
printf("%d ",y);
}
int main()
{
scanf("%d",&t);
for(int ii=;ii<=t;ii++)
{
scanf("%d %d",&m,&n);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&num[i][j]);
for(int i=;i<=m+;i++)
for(int j=;j<=n+;j++)
dp[i][j]=INF;
for(int j=;j<=n;j++)
dp[][j]=num[][j],fa[][j]=j;
for(int i=;i<=m;i++)
{
for(int j=;j<=n;j++)
{
for(int k=;k>=-;k--)
{
if(dp[i][j]>num[i][j]+dp[i-][j+k])
{
dp[i][j]=num[i][j]+dp[i-][j+k];
fa[i][j]=j+k;
}
} //printf("%d ",dp[i][j]);
}
} int ans_max=INF;
int flag;
for(int j=n;j>=;j--)
{ if(dp[m][j]<ans_max)
{
ans_max=dp[m][j];
flag=j;
}
}
printf("Case %d\n",ii);
print(m,flag);
printf("\n");
}
return ;
}