目录
  • 问题描述
  • 问题分析
  • Java代码实现
    • 运行结果
  • 今天老师上完课说所有花都要被放,这个算法还是考虑多了,包含了这个选择,代码就不给了,用dp思想就可以解决了。

问题描述

  假设你想以最美观的方式布置花店的橱窗。现在你有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. 信息学奥赛一本通 1279:【例9.23】橱窗布置(flower) | 洛谷 P1854 花店橱窗布置

    [题目链接] ybt 1279:[例9.23]橱窗布置(flower) 洛谷 P1854 花店橱窗布置 吐槽:一本通中给的测试数据中,负号是全角负号!怪不得每次数据读不完程序就结束了.还是用洛谷的测试 ...

  2. [JOYOI] 1124 花店橱窗

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

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

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

  4. 【DP】花店橱窗布置 (ssl 1626/luogu 1854)

    花店橱窗布置花店橱窗布置花店橱窗布置 ssl 1626 luogu 1854 题目大意: 有n朵花和m个花瓶,每一朵花插在不同的花瓶里会有不同的美丽度,花瓶和花必须按原来的顺序摆放,求最大的美丽值 D ...

  5. 1279:【例9.23】橱窗布置(flower)

    时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 假设以最美观的方式布置花店的橱窗,有F束花,每束花的品种都不一样,同时,至少有同样数量的花瓶,被按顺序摆成一行, ...

  6. AcWing 313. 花店橱窗(DP)

    小q和他的老婆小z最近开了一家花店,他们准备把店里最好看的花都摆在橱窗里. 但是他们有很多花瓶,每个花瓶都具有各自的特点,因此,当各个花瓶中放入不同的花束时,会产生不同的美学效果. 为了使橱窗里的花摆 ...

  7. rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)

    很水,我却做了很久,唉,细节的东西没处理好... 又要顺序又要最大的,看上去感觉就和LCS一样,很容易想出状态转移公式:dp[i,j] = max{dp[i - 1][j - 1] + a[i][j] ...

  8. IOI1999 花店橱窗布置

    Luogu 这可能是继数字金字塔后IOI最水的一道题了.(然而我也就只能做这种水题 设\(dp[i,j]\)表示第\(i\)行选到第\(j\)个最优解,状态转移方程很显然,如下 \[dp[i,j]=\ ...

  9. 花店橱窗布置(洛谷P1854)(动态规划)

    传送门 文章目录 解析 问题 代码 解析 一道很正常的动态规划 dp[i][j]表示到第j个花瓶放了第j朵花的dp最优值 注意:是严格使第i朵放在j瓶 找到最优解递归输出即可 问题 又是初始化的问题! ...

  10. codevs 1028 花店橱窗布置 (KM)

    /*裸地KM*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #d ...

最新文章

  1. 如何更改Twitter Bootstrap模式框的默认宽度?
  2. 自学python要多久才能学会-怎么自学python,大概要多久?
  3. 协作与协同有什么区别_OA软件, BPM系统, 移动办公系统, 协同办公系统到底有什么区别...
  4. Shiro实现认证_ini
  5. 自己动手实现一个简单的JSON解析器
  6. 【matlab】面积图(area函数的应用)
  7. C# 学生成绩管理系统 完整版
  8. java 图片阴影_Java 为 PPT 中的图形添加阴影效果
  9. 新手找客户,牢记20句话
  10. webConfig中System.Web 和 System.WebServer节点读取
  11. 湖南师范大学数学与计算机学院郭水霞,湖南师范大学数学与计算机科学学院2013备考手册...
  12. centos6.9下rpm方式安装mysql后mysql服务无法启动
  13. 如何在Mac上访问 USB 驱动器?
  14. 拖动滑块css,基于JavaScript实现拖动滑块效果
  15. java数组和集合的区别_java中数组和集合的区别是什么?
  16. 2021最全HW蓝队指导手册
  17. SLAM Evaluation 之轨迹对齐论文翻译Closed-Form Solution of Absolute Orientation Using Orthonormal Matrices
  18. android 表情包下载,表情包制作pro
  19. android m壁纸驱动之家,微软打造的良心壁纸App,仅4.2M
  20. ARD智能电动机控制器在苯乙烯生产过程中的应用

热门文章

  1. java的OutOfMemoryError: PermGen space实战剖析
  2. reader技巧总结2.1.doc
  3. Gmail推出视频聊天功能 间接否认欲收购Skype
  4. Harris角点检测算法 1
  5. 人一生之中遇到各种事件的概率
  6. 拓端tecdat|R语言Black Scholes和Cox-Ross-Rubinstein期权定价模型案例
  7. 拓端tecdat|R语言提取时间序列的周期性成分应用EMD,小波滤波器,Baxter过滤器等
  8. hibernate教程笔记7
  9. pands选取满足条件的行和列
  10. 【Caffe实践】基于CNN的性别、年龄识别的代码实现