问题描述

  假设你想以最美观的方式布置花店的橱窗。现在你有F束不同品种的花束,同时你也有至少同样数量的花瓶(V>=F)被按顺序摆成一行。这些花瓶的位置固定于架子上,并从1至V顺序编号,V是花瓶的数目,从左至右排列,则最左边的是花瓶1,最右边的是花瓶V。花束可以移动,并且每束花用1至F间的整数唯一标识。标识花束的整数决定了花束在花瓶中的顺序,如果I<J,则令花束I必须放在花束J左边的花瓶中。

  例如,假设一束杜鹃花的标识数为1,一束秋海棠的标识数为2,一束康乃馨的标识数为3,所有的花束在放入花瓶时必须保持其标识数的顺序,即:杜鹃花必须放在秋海棠左边的花瓶中,秋海棠必须放在康乃馨左边的花瓶中。如果花瓶的数目大于花束的数目。则多余的花瓶必须空置,且每个花瓶中只能放一束花.每一个花瓶都具有各自的特点。因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果,并以美学值(一个整数)来表示,空置花瓶的美学值为零。在上述例子中,花瓶与花束的不同搭配所具有的美学值,如下表所示。

花瓶
1 2 3 4 5
花束 1(杜鹃花) 7 23 -5 -24 16
2(秋海棠) 5 21 -4 10 23
3(康乃馨) -21 5 -4 -20 20

  根据上表,杜鹃花放在花瓶2中,会显得非常好看;但若放在花瓶4中则显得十分难看。为取得最佳美学效果,你必须在保持花束顺序的前提下,使花束的摆放取得最大的美学值。如果有不止一种的摆放方式具有最大的美学值,则其中任何一种摆放方式都可以接受,但你只要输出任意一种摆放方式。

问题分析

如果已知那些需要放到花瓶里,那些不需要放。那么再将这些花束按照顺序摆放,找到最优摆放方式。当已知这个花束放不放时,后面就可以用DP思想填表完成。我们用编码的方式表示这束花会不会摆放。0表示不放,1表示放。因为编码的最后一位比较好得到,所以我们先安排最靠右边的花(当这个花需要摆放时),意思就是先填表的最下一行:(初始值)

dp[i][j]=b[i][j],这个花束被放并且在最右边的花瓶中

用dp[i][j]表示第i个花束放在花瓶j中(在(i+1...F)已经放置情况下)的最大值。则状态转移方程:

dp[i][j]=b[i][j]+max {dp[i+1][m],m in (j+1,n),j in(0,n-num)}

然后对于每一个编码重复这个填表过程最终求得最大值

Java代码实现

	public static void getMax(int[][] b,int F,int V) {
class Point{
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
int n=(1<<F);//获得编码个数
int[][]dp=new int[F][V];
Point[][] p=null;
//Map<Integer,Point[][]> map=new HashMap<Integer,Point[][]>();//保存最优路径,key:编码对应的十进制数
int x=0,mmax=0,ms=0,me=0;//mmax指最大值所有分数中的最大值,ms、me为最大值对应行和列
while(x!=n) {
int num=0,index=0,max=0,temp=x,col=0;//num表示是不是初值,max记录当前编码下的最大值,因为有可能隔行填表,index记录上一次填表的行数,temp表示对x进行移位操作
Point[][]path=new Point[F][V];//保存最优值
for(int i=F-1;i>=0;i--) {
if((temp&1)==1) {//这束花被放
if(num==0)
{
for(int j=0;j<V;j++)
{
dp[i][j]=b[i][j];
if(max<dp[i][j]) {
max=dp[i][j];
col=j;
}
path[i][j]=new Point(-1,-1);
}
}
else
{
for(int j=0;j<V-num;j++) {
int maxx=-1,maxxcol=0;
for(int m=j+1;m<V;m++) {//找到上一次填表中,(j+1)列到最后一列的最大值maxx并且记录最大值的列maxxcol(保存最优解)
if(maxx<b[index][m]) {
maxx=b[index][m];
maxxcol=m;
}
}
dp[i][j]=b[i][j]+maxx;
path[i][j]=new Point(index,maxxcol);
if(max<dp[i][j]) {
max=dp[i][j];
col=j;
}
}
}
index=i;
num++;
}
temp=(temp>>1);//编码进行移位
}
//System.out.println(max);
if(mmax<max) {
mmax=max;
ms=index;
me=col;
p=path;//保存最优路径
}
x++;
}
System.out.println("最大值:"+mmax);
Point t=p[ms][me];
System.out.println((1+ms)+"放"+(1+me));
while(t.x!=-1) {
System.out.println((t.x+1)+"放"+(1+t.y));
t=p[t.x][t.y];
}
}

运行结果

今天老师上完课说所有花都要被放,这个算法还是考虑多了,包含了这个选择,代码就不给了,用dp思想就可以解决了。

花店橱窗布置问题(FLOWER)的更多相关文章

  1. 花店橱窗(flower)

    花店橱窗(flower) 题目描述 某花店现有f束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并 ...

  2. 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)

    花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...

  3. [IOI1999]花店橱窗布置(DP路径记录)

    题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...

  4. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  5. CH5E02 花店橱窗【线性DP】

    5E02 花店橱窗 0x5E「动态规划」练习 背景 xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里.但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的 ...

  6. [JOYOI] 1124 花店橱窗

    题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目背景 xq和他的老婆xz最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里.但是他们 ...

  7. RQNOJ PID496/[IOI1999]花店橱窗布置

    PID496 / [IOI1999]花店橱窗布置 ☆   题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号 ...

  8. codevs1028花店橱窗布置(费用流)

    这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...

  9. 【codevs1028】花店橱窗布置(费用流)

    这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...

随机推荐

  1. D - Leading and Trailing LightOJ - 1282

    题解:求n^k的前三位和后三位. 后三位直接快速幂对1000去余就可以了.前三位可以转换成浮点数来操作,也是用快速幂,我们只保留答案的前三位,当前值大于1000.0的话就除以10,直到结果小于等于10 ...

  2. 今天开始让我们一起来学JavaScript吧!(今天先扯先别的)

    1.为什么要学习JavaScript? 首先它是web开发人员必须学习的3门语言之一: ①HTML定义了网页的内容 ②CSS描述了网页的布局: ③JavaScript网页的行为 首先JavaScrip ...

  3. 你自学半年也搞不懂的go底层,看这篇。这篇讲 go的数组、切片、Maps

    目录 数组 1.定义数组 2.使用数组 3.定义并赋值 4.数组的大小是类型的一部分 5.数组是值类型(当参数传递到函数中,修改不会改变原来的值) 6.数组长度 7.循环数组 8.多维数组 切片 1. ...

  4. testlink的api

    testlink可以做很多你想象得到的事情,如API测试参数管理,Excel导入导出,快速模板创建测试用例,集成Jenkins. TestLink API第三方库: TestLink-API-Pyth ...

  5. Matplotlib 误差线的绘制和子图的创建方式

    一.绘制误差线 使用errorbar方法可以绘制误差线. x = np.linspace(0,10,50) dy=0.8 y = np.cos(x) + dy*np.random.randn(50) ...

  6. Windows API 中 OVERLAPPED 结构体 初始化

    出处:https://github.com/microsoft/Windows-classic-samples/blob/1d363ff4bd17d8e20415b92e2ee989d615cc0d9 ...

  7. ElasticSearch 镜像 & 安装 & 简易集群

    目录 ES镜像 JDK镜像 安装 1. 安装JDK 2. 解压安装ES 3. 配置 4. 新建用户 5. 启动 踩坑 1. root启用报错 2. max file descriptors [4096 ...

  8. 查看 Nginx 的日志目录

    即便是 docker 容器,对应的目录也是一样的 > /var/log/nginx/xxx.log

  9. 在Spring Boot使用H2内存数据库

    文章目录 添加依赖配置 数据库配置 添加初始数据 访问H2数据库 在Spring Boot使用H2内存数据库 在之前的文章中我们有提到在Spring Boot中使用H2内存数据库方便开发和测试.本文我 ...

  10. Angular 7开发环境配置

    目录 前言 一.搭建项目  1.安装Angular CLI  2.创建项目  3.集成Element Angular 二.设置路由  1.创建路由模块  2.导入.导出RouterModule类  3 ...