橱窗布置

 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 }