花店

Description

假设你想以最美观的方式布置花店的橱窗。现在你有F束不同品种的花束,同时你也有至少同样数量的花瓶被按顺序摆成一行。这些花瓶的位置固定于架子上,并从1至V顺序编号,V是花瓶的数目,从左至右排列,则最左边的是花瓶1,最右边的是花瓶V。花束可以移动,并且每束花用1至F间的整数唯一标识。标识花束的整数决定了花束在花瓶中的顺序,如果I<J,则令花束I必须放在花束J左边的花瓶中。你必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值。

Analysis

对于花瓶i,花束j而言有两种情况。

  1. 放,则dp[i][j]=dp[i-1][j-1]+s[i][j]
  2. 不放,则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;
}
posted @ 2018-08-17 11:31  Srzer  阅读(174)  评论(0编辑  收藏  举报