样例能过,但WA
#include<iostream>
#include<cstring>
using namespace std;
const int maxm=140,maxn=105;
int dp[maxm][maxn];
int a[maxm][maxn],fa[maxm][maxn];
int m,n;
void printans(int ans,int cnt){
if(cnt==1)return;
printans(fa[ans][cnt-1],cnt-1);
printf("%d ",ans);
}
int main(){
while(cin>>m>>n){;
memset(dp,0x3f,sizeof(dp));
memset(fa,0,sizeof(fa));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=m;i++){
dp[i][1]=a[i][1];
}
for(int j=2;j<=n;j++)//列
for(int i=1;i<=m;i++)/*行*/{
int dir[]={-1,0,1};
if(i==1)dir[0]=0,dir[1]=1,dir[2]=-1;
if(i==m)dir[0]=1,dir[1]=-1,dir[2]=0;
for(int k:dir){
int las=i+k;
if(las==0)las=m;
if(las>m)las=1;
if(dp[las][j-1]+a[i][j]<dp[i][j]){
dp[i][j]=dp[las][j-1]+a[i][j];
fa[i][j]=las;
}
}
}
int ans=0;
for(int i=1;i<=m;i++){
if(dp[i][n]<dp[ans][n])ans=i;
}
printans(fa[ans][n],n);
printf("%d\n%d\n",ans,dp[ans][n]);
}
return 0;
}