花店橱窗布置(FLOWER)
提交文件名:flower
问题描述:
某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目。花束可以移动,并且每束花用1到F的整数标识。如果I < J,则花束I必须放在花束J左边的花瓶中。例如,假设杜鹃花的标识数为1,秋海棠的标识数为2,康乃馨的标识数为3,所有花束在放入花瓶时必须保持其标识数的顺序,即杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中。如果花瓶的数目大于花束的数目,则多余的花瓶必须空,即每个花瓶只能放一束花。
每个花瓶的形状和颜色也不相同,因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果,并以美学值(一个整数)来表示,空置花瓶的美学值为0。在上述的例子中,花瓶与花束的不同搭配所具有的美学值,可以用如下的表格来表示:
花瓶1 花瓶2 花瓶3 花瓶4 花瓶5
杜鹃花 7 23 -5 -24 16
秋海棠 5 21 -4 10 23
康乃馨 -21 5 -4 -20 20
根据表格,杜鹃花放在花瓶2中,会显得非常好看,但若放在花瓶4中,则显得很难看。
问题求解:
为了取得最佳的美学效果,必须在保持花束顺序的前提下,使花的摆放取得最大的美学值,如果具有最大美学值的摆放方式不止一种,则输出任何一种方案即可。
输入文件(flower.in):
输入文件的第一行是两个整数F和V,分别为花束数和花瓶数(1≤F≤100,F≤V≤100)。接下来是矩阵Aij,它有I行,每行J个整数,Aij表示花束I摆放在花瓶J中的美学值。
输出文件(flower.out):
输出文件的第一行是一个整数,为最大的美学值;接下来有F行,每行两个数,为那束花放入那个花瓶的编号。
输入样例:
3 5
7 23 –5 –24 16
5 21 –4 10 23
-21 5 –4 –20 20
输出样例
53
2 4 5
【解题思路】
根据题意,可以判断此题用动态规划可解。
设f[i][j]为第i种花插入第j个花瓶的最大美学值。
那么可以写出状态转移方程

f[i][j]=max(f[i-1][k]+a[i][j],f[i][j]);(i-1<=k<j)

路径的输出只要记住f[i][j]的最值出现时第i-1种花插入了哪个花瓶即可。
最后只需要从最大值倒回去走一遍,就可以求出路径。
注意初始化,因为涉及负数运算
【参考程序】

#include<iostream>
#include<cstdio>
using namespace std;
int f,v,a[101][101],dp[101][101],ans,record[101][101],choice[101];
int main()
{
freopen("flower.in","r",stdin);
freopen("flower.out","w",stdout);
cin>>f>>v;
for (int i=1;i<=f;i++)
for (int j=1;j<=v;j++)
{
cin>>a[i][j];
dp[0][j]=0;
dp[i][j]=-1000000;
} for (int i=1;i<=f;i++)
{
for (int j=i;j<=v-f+i;j++)
for (int k=i-1;k<j;k++)
if (dp[i-1][k]+a[i][j]>dp[i][j])
{
dp[i][j]=dp[i-1][k]+a[i][j];
record[i][j]=k;//记录
}
}
for (int i=f;i<=v;i++)
if (ans<dp[f][i])
{
ans=dp[f][i];//求最优值
choice[f]=i;
}
int i=f-1;
while (i>0)
{
choice[i]=record[i+1][choice[i+1]];
i--;
}
cout<<ans<<endl;
for (int i=1;i<=f;i++) cout<<choice[i]<<" ";
return 0;
}
#include<iostream>
#include<cstdio>
using namespace std;
int f,v,val[105][105],choice[105],record[105][105],a[105][105],ans;
int main()
{
scanf("%d%d",&f,&v);
for (int i=1;i<=f;i++)
for (int j=1;j<=v;j++)
{
scanf("%d",&val[i][j]);
a[i][j]=-0xfffffff;
}
for (int i=1;i<=f;i++)
for (int j=i-1;j<v;j++)
for (int k=j+1;k<=v;k++)
{
if (a[i-1][j]+val[i][k]>a[i][k])
{
a[i][k]=a[i-1][j]+val[i][k];
record[i][k]=j;
}
}
for (int i=f;i<=v;i++)
{
if (ans<a[f][i])
{
ans=a[f][i];
choice[f]=i;
}
}
int i=f-1;
while (i>0)
{
choice[i]=record[i+1][choice[i+1]];
i--;
}
printf("%d\n",ans);
for (int i=1;i<=f;i++) cout<<choice[i]<<" ";
return 0;
}

【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)的更多相关文章

  1. 【2018寒假集训 Day2】【动态规划】垃圾陷阱(挖坑等填,未完成)

    垃圾陷阱 (well) 卡门--农夫约翰极其珍视的一条Holsteins奶牛--已经落了到"垃圾井"中."垃圾井"是农夫们扔垃圾的地方,它的深度为D (2 &l ...

  2. 【2018寒假集训 Day2】【动态规划】抢金块

    抢金块 输入文件:gold.in 输出文件:gold.out 问题描述: 地面上有一些格子,每个格子上面都有金块,但不同格子上的金块有不同的价值,你一次可以跳S至T步 .如果S=2,T=4.你就可以跳 ...

  3. 【2018寒假集训 Day2】【动态规划】回文字

    回文字(palin) 问题描述: 如果一个单词从前和从后读都是一样的,则称为回文字.如果一个单词不是回文字,则可以把它拆分成若干个回文字.编程求一个给定的字母序列,最多要分割成几部分,使每一部分都回文 ...

  4. 【2018寒假集训 Day2】【动态规划】维修栅栏

    维修栅栏 问题描述: 小z最近当上了农场主!不过,还没有来得及庆祝,一件棘手的问题就摆在了小z的面前.农场的栅栏,由于年久失修,出现了多处破损.栅栏是由n块木板组成的,每块木板可能已经损坏也可能没有损 ...

  5. 【2018寒假集训 Day2】【动态规划】又上锁妖塔

    又上锁妖塔 (tower.in/tower.out) [题目描述] 小D在X星买完了想要的东西,在飞往下一个目的地的途中,正无聊的他转头看了看身边的小A,发现小A正在玩<仙剑>,可是小A很 ...

  6. 【2018寒假集训 Day2】【动态规划】钱币兑换(exchange)(自己翻译的2333)

    钱币兑换(exchange) 问题描述: Dave偶然获得了未来几天的美元(dollars)与马克(marks)之间的兑换率.例如Dave开始有100marks,请编写个程序帮助Dave找出最好的买卖 ...

  7. 【2018寒假集训 Day2】【动态规划】挖地雷

    挖地雷(Mine) 在一个地图上有N 个地窖(N<=200),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径,并规定路径都是单向的,且从编号小的地窖通向编号大的地窖.某人可以从任一处 ...

  8. 【集训Day4 动态规划】【2018寒假集训 Day4 更新】蛙人

    蛙人 (ple) 蛙人使用特殊设备潜水.设备中有一个气瓶,分两格:一格装氧气,另一格装氮气.留在水中有时间的限制,在深水中需要大量的氧气与氮气.为完成任务,蛙人必须安排好气瓶.每个气瓶可以用它的重量和 ...

  9. 【集训Day3 单调队列】【2018寒假集训Day 5更新】最大子序列和

    最大子序列和(maxsum) [问题描述] 输入一个长度为n的整数序列(A1,A2,……,An),从中找出一段连续的长度不超过M的子序列,使得这个序列的和最大. 例如: 序列 1, -3, 5, 1, ...

随机推荐

  1. 手写一个简单的ElasticSearch SQL转换器(一)

    一.前言 之前有个需求,是使ElasticSearch支持使用SQL进行简单查询,较新版本的ES已经支持该特性(不过貌似还是实验性质的?) ,而且git上也有elasticsearch-sql 插件, ...

  2. InitializingBean,spring 初始化bean

    springframework的提供接口,InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的 ...

  3. 判断是否存在UI被触摸

    ) || (Input.touchCount > && Input.GetTouch().phase == TouchPhase.Began)) { #if UNITY_ANDR ...

  4. malloc面试题目(转) - [C++]

    试题4: void GetMemory( char *p ){ p = (char *) malloc( 100 );} void Test( void ) { char *str = NULL; G ...

  5. 怎样通过excel录入来批量造数据

    背景: 自动化测试除了验证系统功能外,还能够为测试人员根据测试要求造数据实现测试需要!但是一般的自动化测试,都是在编写脚本的时候,写死在程序里的.所以本文是为了在满足系统操作流程的基础上,根据测试的要 ...

  6. Unity中的资源管理

    一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了.而且 ...

  7. java中的时区转换

    目录 java中的时区转换 一.时区的说明 二.时间的表示 三.时间戳 四.Date类和时间戳 五.java中的时区转换 java中的时区转换 一.时区的说明 地球表面按经线从东到西,被划成一个个区域 ...

  8. 加上cdn后字体跨域

    @font-face是CSS3中的一个特性,可以把自己定义的Web字体嵌入到网页中,随着@font-face,越来越多的网页采用字体图标作为网页中的小图形. 比如Bootstrap就采用了Glyphi ...

  9. fastfdfs上传代码

    //上传到FDFS //获取后缀名 String extension = StringUtils.substringAfterLast(file.getOriginalFilename()," ...

  10. 【XSY2505】tree

    Description 机房断网了!xj轻而易举地撬开了中心机房的锁,拉着zwl走了进去.他们发现中心主机爆炸了. 中心主机爆炸后分裂成了 n 块碎片,但碎片仍然互相连接,形成一个树的结构.每个碎片有 ...