1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=105; 7 int a[N][N],f[N][N],t[N][N]; 8 void print(int r,int c){ 9 if(!r)return; 10 print(r-1,t[r][c]); 11 cout<<c<<" "; 12 } 13 int main(){ 14 int r,c; 15 scanf("%d%d",&r,&c); 16 for(int i=1;i<=r;i++) 17 for(int j=1;j<=c;j++) 18 scanf("%d",&a[i][j]); 19 memset(f,-127,sizeof(f)); 20 f[0][0]=0; 21 //dp,f[i][j]表示将第i束花放在第j个花瓶上时前i束花所得到的最大美学值 22 for(int i=1;i<=r;i++)//i束花 23 for(int j=i;j<=c-r+i;j++)//第i束花放在第j个花瓶 24 for(int k=i-1;k<j;k++)//遍历上一束花可放的花瓶 25 if(f[i][j]<f[i-1][k]+a[i][j]){ 26 f[i][j]=f[i-1][k]+a[i][j]; 27 t[i][j]=k; 28 } 29 int maxx=0xf0000000,p; 30 for(int i=r;i<=c;i++) 31 if(maxx<f[r][i]){ 32 maxx=f[r][i]; 33 p=i; 34 } 35 cout<<maxx<<endl; 36 print(r,p); 37 return 0; 38 }