#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000;
const int INF=0X3f3f3f3f;
int m,n;
int a[maxn][maxn],d[maxn][maxn];
int nexts[maxn][maxn];
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
int first=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
int ans=INF;
for(int j=n-1;j>=0;j--)
{
for(int i=0;i<m;i++)
{
if(j==n-1) d[i][j]=a[i][j];
else
{
int row[3]={i,i-1,i+1};
if(i==0) row[1]=m-1;
if(i==m-1) row[2]=0;
sort(row,row+3);
d[i][j]=INF;
for(int k=0;k<3;k++)
{
int v=d[row[k]][j+1]+a[i][j];
if(v<d[i][j])
{
d[i][j]=v;
nexts[i][j]=row[k];
}
}
}
if(j==0&&d[i][j]<ans)
{
ans=d[i][j];
first=i;
}
}
}
printf("%d",first+1);
int j=1;
for(int i=nexts[first][0];j<n;i=nexts[i][j],j++)
printf(" %d",i+1);
printf("\n%d\n",ans);
}
return 0;
}
这个题的解答其实是有点难度的,主要就是从小紫书上看得算法理解了,自己敲出来就好了。
UVa 116
最新推荐文章于 2021-05-23 09:28:40 发布