Uva116

来源:互联网 发布:战舰世界库图佐夫数据 编辑:程序博客网 时间:2024/05/19 05:33

注意边界,注意初始化

#include<cctype>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define REP(i,a,b) for (i=(a);i<=(b);i++)#define CLEAR(a) memset((a),0,sizeof((a)))using namespace std;typedef long long LL;const double pi = acos(-1.0);const int maxn=2e3;const int inf=9999999;int n,m;int a[maxn][maxn],d[maxn][maxn],next[maxn][maxn];void init();void dp();void outp();int main(){    while (~scanf("%d%d",&n,&m))        {            init();            dp();            outp();        }    return 0;}void dp(){    int ans=inf,first=0;    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;next[i][j]=row[k];}            }        }        if (j==0&&d[i][j]<ans) {ans=d[i][j];first=i;}    }    printf("%d",first+1);    for(int i=next[first][0],j=1;j<n;i=next[i][j],j++) printf(" %d",i+1);    printf("\n%d\n",ans);    }}void init(){    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            cin>>a[i][j];    CLEAR(d);CLEAR(next);}void outp(){}


0 0
原创粉丝点击