东莞市2011年信息学特长生测试题 花店布置(dp)

东莞市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);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值