【11年特长生第三题】【DP】花店布置

花 店 布 置 花店布置


题目

小张在“五一”开了一家花店,他希望把他花店的柜台布置得尽可能地漂亮。他有F束不同的鲜花,还有更多数量的花瓶来放这些鲜花。花瓶被排成一行放在货贺上,并从1到V依次编号。1号瓶放在最左面,V号瓶放在最右面。鲜花也被从1到F编号。编号小的鲜花所放的花瓶的编号也小。也就是说,如果I 因为花瓶的形状,鲜花种类也不同,因此不同种类的鲜花放入不同形状的花瓶可能产生不同的效果。我们用一整数来表示每种组合的好看程度,并列出一张表。我们规定空置花瓶的好看程度为0

根据上面的表格,杜鹃花放 2 2 2号瓶中最好看,而在 4 4 4号瓶中则显得很难看。
为了达到最好的视觉效果,小张想他的布置方案在满足鲜花插放顺序的前提下,好看程度之和必须最大。现在他请你帮他编写程序求出符合他要求的好看程度之和的最大值。
数据范围: 1 = < f < = 100 1=1=<f<=100, 其中f是鲜花数目。鲜花由编号 1 1 1 f f f f = < v < = 100 f=f=<v<=100, 其中 v v v是花瓶的数量。 − 50 = < A i j < = 50 -50=50=<Aij<=50, 其中Aij是把编号为I的鲜花放入编号为j的花瓶所得到的好看程度。

输入

从文件flower.in中读入数据,其中:第一行有两个整数:f、v,接下来有f行:每行有V个整数,Aij 位于输入文件的第 (i+1)行中的第j个数。

输出

结果输出到文件flower.out中,只有一个数,表示好看程度之和的最大值。

输入样例

flower.in
3  5 
7  23  -5  -24  16
5  21  -4  10  23
-21  5  -4  -20  20

输出样例

flower.out
53

解题思路

这题我用的是DP
f [ i ] [ j ] f[i][j] f[i][j]表示前i朵花束放进前j个花瓶中的最大美观值
状态转移方程为

f [ i ] [ j ] = m a x ( f [ i ] [ j − 1 ] , f [ i − 1 ] [ j − 1 ] + a [ i ] ) f[i][j]=max(f[i][j-1],f[i-1][j-1]+a[i]) f[i][j]=max(f[i][j1],f[i1][j1]+a[i])
1,选第 i i i朵花束
2,不选第 i i i朵花束

因为要输出具体位置,所以最后要递归处理一下

程序如下

**#include<iostream>
#include
#include
#include

using namespace std;

int n,m,ans;

int a[10001][1001],f[10001][1001];

int main()
{
	freopen("flower.in","r",stdin);
	freopen("flower.out","w",stdout);
	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] = -2147483647;
		}
	for(int i = 1; i <= n; ++i)
	{
		for(int j = 1; j <= m; ++j)
		{
			for(int k = i - 1; k <= j - 1; ++k)
			{
				if(a[i][j] + f[i - 1][k] > f[i][j]) 
					f[i][j] = a[i][j] + f[i - 1][k];
			}
		}
	}
	ans = -2147483647;
	for(int i = 1; i <= m; ++i)
		if(f[n][i] > ans) ans = f[n][i];
	printf("%d",ans);
	return 0;
} **

你可能感兴趣的:(DP,ssl)