标签:des style http io color ar os java for

2 4 3 55 32 75 17 69 73 54 81 63 47 5 45 6 6 51 57 49 65 50 74 33 16 62 68 48 61 2 49 76 33 32 78 23 68 62 37 69 39 68 59 77 77 96 59 31 88 63 79 32 34
Case 1 2 1 1 2 Case 2 3 2 1 1 2 1
题意:给一个m*n的矩阵,找到一个纵向的"线"使得线上的和最小并输出这条线,线能向8个方向
延伸,要求找的是纵向的一条线(每一行各取一个点连成一线) ,输出路径,若有多条路径,输出最
靠右的。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 110;
int dp[maxn][maxn],path[maxn][maxn],a[maxn][maxn],n,m;
void initial()
{
memset(path,-1,sizeof(path));
for(int i=0; i<maxn; i++)
for(int j=0; j<maxn; j++)
dp[i][j]=inf;
}
void input()
{
scanf("%d %d",&n,&m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&a[i][j]);
}
void print(int num,int index)
{
if(num<1) return ;
if(path[num][index]==-1)
{
printf("%d ",index);
return ;
}
else
{
print(num-1,path[num][index]);
printf("%d ",index);
}
}
void solve(int co)
{
printf("Case %d\n",co);
for(int j=1; j<=m; j++) dp[1][j]=a[1][j];
for(int i=2; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(j!=1 && dp[i][j]>dp[i-1][j-1]+a[i][j])
{
dp[i][j]=dp[i-1][j-1]+a[i][j];
path[i][j]=j-1;
}
if(dp[i][j]>=dp[i-1][j]+a[i][j])
{
dp[i][j]=dp[i-1][j]+a[i][j];
path[i][j]=j;
}
if(j!=m && dp[i][j]>=dp[i-1][j+1]+a[i][j])
{
dp[i][j]=dp[i-1][j+1]+a[i][j];
path[i][j]=j+1;
}
}
int Min=inf,index=-1;
for(int j=m;j>=1;j--)
{
if(Min>dp[n][j])
{
Min=dp[n][j];
index=j;
}
}
print(n-1,path[n][index]);
printf("%d\n",index);
}
int main()
{
int T;
scanf("%d",&T);
for(int co=1; co<=T; co++)
{
initial();
input();
solve(co);
}
return 0;
}
hdu 5092 Seam Carving(DP+记录路径)
标签:des style http io color ar os java for
原文地址:http://blog.csdn.net/u012596172/article/details/40783763