橱窗布置
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 }