对于可变行的排序不太好想,学到了新的排序思路,这题用逆推比较容易记录每列的行序号。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int g[105][105];
int d[105][105];
int next1[105][105];
int ans;
int first;
void dp(int r,int c ){
ans=inf,first=0;
for (int j=c-1;j>=0;j--) {
for (int i=0;i<r;i++) {
if (j==c-1) d[i][j]=g[i][j];
else {
int row[3]={i,i-1,i+1};
if (i==0) row[1]=r-1;/
if (i==r-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]+g[i][j];
if (v<d[i][j]) { d[i][j]=v;next1[i][j]=row[k];}
}
}
if (j==0&&ans>d[i][j]) { ans=d[i][j];first=i;}
}
}
}
int main(){
int i,j,a,b;
int kase=1;
while(~scanf("%d %d",&a,&b))
{
ans=inf;
first=0;
memset(next1,-1,sizeof(next1));
for(int i=0;i<a;i++)
for(int j=0;j<b;j++)
{
int k;
scanf("%d",&k);
g[i][j]=k;
}
dp(a,b);
printf("%d",first+1);
for(int i=next1[first][0],j=1;j<b;i=next1[i][j],j++)
printf(" %d",i+1);
printf("\n%d\n",ans);
}
}