Description
假设你想以最美观的方式布置花店的橱窗。现在你有F束不同品种的花束,同时你也有至少同样数量的花瓶被按顺序摆成一行。这些花瓶的位置固定于架子上,并从1至V顺序编号,V是花瓶的数目,从左至右排列,则最左边的是花瓶1,最右边的是花瓶V。花束可以移动,并且每束花用1至F间的整数唯一标识。标识花束的整数决定了花束在花瓶中的顺序,如果I<J,则令花束I必须放在花束J左边的花瓶中。你必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值。
Analysis
对于花瓶i,花束j而言有两种情况。
- 放,则dp[i][j]=dp[i-1][j-1]+s[i][j]
- 不放,则dp[i][j]=dp[i-1][j]
动规可行性判断:
- 最优子结构:之前的花摆放美学值最大才能使之后的状态最优
- 无后效性:做出选择后并不会妨碍之后花束的放置。
dp[i][j]=max(dp[i-1][j-1]+s[i][j],dp[i-1][j])
Code
#include <bits/stdc++.h>
int n,m,beauty[101][101],dp[101][101];
int main()
{
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
std::cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
std::cin>>beauty[j][i];
for(int i=0;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j]=-10000;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
dp[i][j]=std::max(dp[i-1][j],dp[i-1][j-1]+beauty[i][j]);
std::cout<<dp[m][n]<<std::endl;
return 0;
}