花店橱窗布置(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. ZTUnity Profiler概述及Profiler window 说明

    转贴链接:https://www.jianshu.com/p/ca2ee8a51754

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

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

  3. Bigo的Java面试,我挂在了第三轮技术面上.........

    背景 前段时间家里出了点事,辞职回家待了一段时间,处理完老家的事情后就回到广州这边继续找工作,大概是国庆前几天我去面试了一家叫做Bigo(YY的子公司),面试的职位是面向3-5年的Java开发,最终自 ...

  4. leetcode算法小题(1)

    题目描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数 ...

  5. 第三十四章 POSIX消息队列

    POSIX消息队列相关函数 mq_open 功能: 用来创建和访问一个消息队列 原型: mqd_t mq_open(const char *name, int oflag); //只能用来打开消息队列 ...

  6. 【原创】go语言学习(二十一)Select和线程安全

    目录 select语义介绍和使用 线程安全介绍 互斥锁介绍和实战 读写锁介绍和实战 原子操作介绍 select语义介绍和使用 1.多channel场景 A. 多个channel同时需要读取或写入,怎么 ...

  7. maven项目部署到tomcat方法

    今天记录下,maven项目部署到服务器的过程 1.首先在ide中里将自己的maven项目打包 mvn clean install 2. 看是否需要修改war包的名字,如果要修改,就用命令 mv xxx ...

  8. MBR分区表的备份与还原

    MBR分区表的备份与还原 MBR分区的存储 从下图可以看出,MBR分区前446字节是boot loader:接下来64字节是分区表:再然后就是三个主分区加一个拓展分区. 一.备份分区表,要跳过前446 ...

  9. jquery正确获取iframe里元素的方法

    <iframe id="_ae_frame" width="100%" height="100%" frameborder=" ...

  10. ios沙盒机制---基本数据类型的存取和文件的基本操作

    沙盒快速存储及读取 存储:  [[NSUserDefaults standardUserDefaults] setObject:@"abc" forKey:@"1&quo ...