东莞市2011年信息学特长生测试题 花店布置
Description
小张在“五一”开了一家花店,他希望把他花店的柜台布置得尽可能地漂亮。他有F束不同的鲜花,还有更多数量的花瓶来放这些鲜花。花瓶被排成一行放在货贺上,并从1到V依次编号。1号瓶放在最左面,V号瓶放在最右面。鲜花也被从1到F编号。编号小的鲜花所放的花瓶的编号也小。也就是说,如果I因为花瓶的形状,鲜花种类也不同,因此不同种类的鲜花放入不同形状的花瓶可能产生不同的效果。我们用一整数来表示每种组合的好看程度,并列出一张表。我们规定空置花瓶的好看程度为0。
根据上面的表格,杜鹃花放2号瓶中最好看,而在4号瓶中则显得很难看。
为了达到最好的视觉效果,小张想他的布置方案在满足鲜花插放顺序的前提下,好看程度之和必须最大。现在他请你帮他编写程序求出符合他要求的好看程度之和的最大值。
Input
从文件flower.in中读入数据,其中:第一行有两个整数:f、v,接下来有f行:每行有V个整数,Aij 位于输入文件的第 (i+1)行中的第j个数。
Output
结果输出到文件flower.out中,只有一个数,表示好看程度之和的最大值。
分析:经典动归,f[i][j]表示前i朵花放在前j个花瓶时的最优解,则有f[i][j]=max(f[i-1][k]+a[i][j])
0< i< n,0< j< m-n+i,i-1<=k
#include <cstdio>
using namespace std;
int a[500][500],f[500][500];
int n,m;
int max(int x,int y)
{
if (x>y) return x;
return y;
}
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]);
for (int i=1;i<=m-n+1;i++)
f[1][i]=a[1][i];
for (int i=1;i<=n;i++)
for (int j=1;j<=m-n+i;j++)
for (int k=i-1;k<=j-1;k++)
f[i][j]=max(f[i][j],f[i-1][k]+a[i][j]);
int ans=0;
for (int i=n;i<=m;i++)
ans=max(ans,f[n][i]);
printf("%d",ans);
}