花店橱窗布置【动态规划】
题目描述
AC代码
#include<bits/stdc++.h>
using namespace std;
int f,v;
int a[105][105], dp[105][105], cho[105][105];
void find(int x, int y){ //找路径
if (!x) //第0束花结束
return;
if (cho[x][y]) //如果第x束花放在第y个花瓶
find(x - 1,y - 1),cout<<y<<" "; //先找出第x-1束花放在第y-1个花瓶
else
find(x, y - 1); //找第x束花放在第y-1个花瓶
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>f>>v;
for(int i = 1;i <= f;++i){
for (int j = 1; j <= v; ++j) {
cin>>a[i][j];
}
}
memset(dp,-0x3f,sizeof dp); //初始化为负无穷
for (int i = 0; i <= v; ++i) {
dp[0][i] = 0; //初始化
}
for (int i = 1; i <= f; ++i) { //遍历每束花
for (int j = 1; j <= v; ++j) { //遍历每个花瓶
if (dp[i - 1][j - 1] + a[i][j] > dp[i][j]) //第i束花放在第j个花瓶
dp[i][j] = dp[i - 1][j - 1] + a[i][j], cho[i][j] = true;
if (dp[i][j - 1] > dp[i][j]) //如果放在j-1之前的效果更好
dp[i][j] = dp[i][j - 1], cho[i][j] = false;
}
}
cout<<dp[f][v]<<"\n";
find(f, v);
return 0;
}
/*
3 5
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20
53
2 4 5
*/