又是超时啊。
# include <stdio.h>
# define MIN(X,Y) ((X)<(Y) ? (X):(Y))
int f[12][105];
int p[12][105];
int col, row;
int main()
{
int i, j, ans, t, x;
while (~scanf("%d%d", &row, &col))
{
for (i = 0; i < row; ++i)
for (j = 0; j < col; ++j)
{
scanf("%d", &f[i][j]);
}
for (j = col-2; j >= 0; --j)
for (i = 0; i < row; ++i)
{
x = (f[(i+1)%row][j+1] < f[(i-1+row)%row][j+1]) ? ((i+1)%row) : ((i-1+row)%row);
if (f[(i+1)%row][j+1] == f[(i-1+row)%row][j+1]) x = MIN((i+1)%row, (i-1+row)%row);
if (f[x][j+1] > f[i][j+1] || (f[x][j+1] == f[i][j+1] && i < x)) x = i;
f[i][j] += f[x][j+1];
p[i][j] = x;
}
for (ans = (1<<30)+1, i = 0; i < row; ++i)
if (f[i][0] < ans) {ans = f[i][0]; t = i;}
printf("%d", t+1);
for (j = 0; j < col - 1; ++j)
{
printf(" %d", p[t][j]+1);
t = p[t][j];
}
printf("\n%d\n", ans);
}
return 0;
}
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
const int INF=10000000;
struct node
{
int x,y;
}path[12][105];
int grid[12][105],dp[12][105];
int N,M;
void solve()
{
//queue<int> q;
for(int j=2;j<=M;j++)
{
for(int i=1;i<=N;i++)
{
int x,y,z;
if(i==1) x=dp[N][j-1];
else x=dp[i-1][j-1];
y=dp[i][j-1];
if(i==N) z=dp[1][j-1];
else z=dp[i+1][j-1];
dp[i][j]=min(min(x,y),z)+grid[i][j];
if(x<y&&x<z)
{
if(i==1) path[i][j].x=N;
else path[i][j].x=i-1;
}
else if(y<x&&y<z)
path[i][j].x=i;
else if(z<x&&z<y)
{
if(i==N) path[i][j].x=1;
else path[i][j].x=i+1;
}
else if(x==y&&x==z)
{
if(i==N) path[i][j].x=1;
else if(i==1) path[i][j].x=i;
}
else if(x==y&&x<z)
{
if(i==1) path[i][j].x=i;
else path[i][j].x=i-1;
}
else if(x==z&&x<y)
{
if(i==N) path[i][j].x=1;
else if(i==1) path[i][j].x=i+1;
}
else if(y==z&&y<x)
{
if(i==N) path[i][j].x=1;
else path[i][j].x=i;
}
path[i][j].y=j-1;
}
}
stack<int> q;
int max1=INF,x,y=M;
for(int i=1;i<=N;i++)
if(dp[i][M]<max1)
{
max1=dp[i][M];
x=i;
}
for(int i=1;y!=1;i++)
{
q.push(x);
x=path[x][y].x;
y=path[x][y].y;
}
q.push(x);
printf("%d",q.top());
q.pop();
while(!q.empty())
{
printf(" %d",q.top());
q.pop();
}
printf("\n%d\n",dp[N][M]);
}
int main()
{//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
scanf("%d",&grid[i][j]);
if(j==1)
dp[i][j]=grid[i][j];
}
solve();
}
return 0;
}