题目:花店橱窗布置
思路:
f[i][j]表示用前i束花,最后一朵花在第j个花瓶中的最大美学值。
转移方程:f[i][j]=max(f[i-1][k]+a[i][j])
g[i][j]表示这个状态的上一个状态为g[i-1][g[i][j]]。
最后通过g倒退来输出。
注意:边界,f初始化为-inf,f[1][i]=a[1][i]。
代码:
扫描二维码关注公众号,回复:
1799570 查看本文章
#include<bits/stdc++.h>
using namespace std;
#define maxn 100
#define inf (1<<30)
int n,m;
int a[maxn+5][maxn+5]= {0};
int f[maxn+5][maxn+5]= {0}; //f[i,j]:用前i束花,最后一朵花在第j个花瓶中的最大美学值
int g[maxn+5][maxn+5]= {0}; //g[i,j]:上一朵花的位置
int main() {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
scanf("%d",&a[i][j]);
f[i][j]=a[i][j];
}
}
for(int i=2; i<=n; i++) {
for(int j=1; j<=m; j++) {
f[i][j]=-inf;
for(int k=1; k<j; k++) {
if(f[i-1][k]+a[i][j]>f[i][j]) {
f[i][j]=f[i-1][k]+a[i][j];
g[i][j]=k;
}
}
}
}
int x=0,s=-inf;
for(int i=1;i<=m;i++){
if(s<f[n][i]) {
s=f[n][i];
x=i;
}
}
printf("%d\n",s);
int w=x,j=n;
vector<int> vec;
while(j){
vec.push_back(w);
w=g[j][w];
j--;
}
for(int i=vec.size()-1;i>=0;i--) {
printf("%d ",vec[i]);
}
return 0;
}