https://www.luogu.org/problemnew/show/P1854

题目描述

  某花店现有编号由 1 到 F 的 F 束花, 每一束花的品种都不一样. 编号由 1 到 V 的 V 个花瓶被按顺序摆成一行, 花瓶的数量至少和花的数量相同. 现在要把所有花放到花瓶中, 规定每个花瓶最多只能放一束花, 且 ∀ i < j, 第 i 束花必须放在第 j 束花的左侧.

  每个花瓶的形状和颜色不同, 因此放入不同的花会产生不同的美学效果. 空花瓶的美学值为 0. 请你给出一种方案, 使得总美学值最大.

输入输出格式

输入格式:

  第一行有两个整数 F 和 V, 分别为花束数和花瓶数 ( 1 ≤ F ≤ V ≤ 100 ).

  第二行到第 F + 1 行, 每行有 V 个整数. 第 i 行的第 j 个整数代表花束 i 放到花瓶 j 中的美学值.

输出格式:

  第一行输出一个整数,为最大美学值.

  第二行输出 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] 为将编号 1 到 i 的花束放入编号 1 到 j 的花瓶中时最大的美学值, a[i][j]为将第 i 束花放入第 j 个花瓶所能产生的美学值, 有 f[i][j] = max(f[i - 1][j - 1] + a[i][j], f[i][j - 1]).

  • 滚动数组

  可以省去表示花束的一维, 用 f[i] 表示在前 i 个花瓶中放入当前数量花束的最大美学值.

  例如, 对于样例, 可以按如下方法计算:

  初始状态:

i 0 1 2 3 4 5
f[i] 0 0 0 0 0 0

  考虑第一束花后:

i 0 1 2 3 4 5
f[i] 0 7 23 -5 -24 16

  ∵ 此时 f[i] 表示在前 i 个花瓶中放入第一束花的最大美学值.

  ∴ ∀ i > j, f[i] ≥ f[j], f 数组应修改为:

i 0 1 2 3 4 5
f[i] 0 7 23 23 23 23

  以此类推, 考虑第二束花:

i 0 1 2 3 4 5
f[i] 0 0 28 19 33 46
i 0 1 2 3 4 5
f[i] 0 0 28 28 33 46

  考虑第三束花:

i 0 1 2 3 4 5
f[i] 0 0 0 24 8 53
i 0 1 2 3 4 5
f[i] 0 0 0 24 24 53

  由此得到答案 53. 显然, 题目所要求的摆放方案可以在刷表的同时记录下来.

实现

 #include <iostream>
 #include <cstdio>
 #define IsDigit(x) ((x) >= '0' && (x) <= '9')
 using namespace std;

 int f, v;
 ][], dp[], plan[][][], s[];

 int Read(void)
 {
     ), sign(false);

     c = getchar();
     while (!IsDigit(c) && c != '-')
         c = getchar();
     c == '-' && (sign = true, c = getchar());
     do
         ret = ret *  + c - ';
     while ((c = getchar()) && IsDigit(c));
     return sign ? -ret : ret;
 }

 int main()
 {
     ), nxt;

     f = Read();
     v = Read();
     ; i <= f; ++i)
         ; j <= v; ++j)
             in[i][j] = Read();
     ; i <= f; ++i) {
         for (int j = v - f + i; j >= i; --j) {
             dp[j] = dp[j - ] + in[i][j];
             plan[i][j][] = plan[i - ][j - ][];
             plan[i][j][] = j;
         }
         ; j <= v - f + i; ++j)
             dp[j - ] > dp[j] &&
              (dp[j] = dp[j - ], plan[i][j][] = plan[i][j - ][], plan[i][j][] = plan[i][j - ][]);
     }
     nxt = v;
     for (int i = f; i; --i) {
         s[pos++] = plan[i][nxt][];
         nxt = plan[i][nxt][];
     }
     printf("%d\n", dp[v]);
     ; i >= ; --i)
         printf("%d ", s[i]);
     printf("\n");
     ;
 }

洛谷【P1854】花店橱窗布置的更多相关文章

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

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

  2. 洛谷 P1854 花店橱窗布置 【dp】

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

  3. 洛谷 P1854 花店橱窗布置

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

  4. 洛谷P1854 花店橱窗布置

    题目 DP,直接递推比记忆化搜索简单. 定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值. 易得状态转移方程 \(dp[i][j]=max(dp[i-1][k]+a[i] ...

  5. 洛谷 P1854 花店橱窗布置 题解

    Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 ...

  6. [动态规划]P1854 花店橱窗布置

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

  7. luogu P1854 花店橱窗布置

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

  8. 题解 P1854 花店橱窗布置

    把二维压成一维的DP了解一下... 传送门 (以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha) 显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置 ; ...

  9. 【Luogu】P1854花店橱窗布置(DP)

    照例良心题目链接 此题使用f[i][j]表示前i束花放进前j个花瓶的时候的最大值.转移方程如下 f[i][j]=max(f[i][j-1],f[i-1][j-1]+que[i][j]) 其中que[i ...

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

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

随机推荐

  1. 我的QT5学习之路(四)——信号槽

    一.前言 前面说了Qt最基本的实例创建.控件以及工具集的介绍,相当于对于Qt有了一个初次的认识,这次我们开始认识Qt信号通信的重点之一——信号槽. 二.信号槽 信号槽是 Qt 框架引以为豪的机制之一. ...

  2. 我的QT5学习之路(目录)

    说明:本目录内容为自己学习的心得和记录,参考资料来源于网络,学习过程中多方汲取,如有错误,欢迎指正和批评. Qt开发相关文章目录 一.我的Qt学习之路系列 1.[笔记]我的Qt学习之路(一)——浅谈Q ...

  3. 串行通讯协议--起止式异步通讯协议(UART)

    起止式异步通讯协议: 特点与格式: 起止式异步协议的特点是一个字符一个字符传输,并且传送一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求.其格式如图3 所示.每一个字符的前面都有 ...

  4. Xcode12 libstdc-.6.0.9.tbd问题

    https://github.com/Kila2/libstdc-.6.0.9.tbd # libstdc-.6.0.9.tbd libstdc++.6.0.9.tbd # for device pu ...

  5. Z字形编排问题详解(C++)

    Z字形编排问题详解(C++): 问题描述:给定一个矩阵matrix,输出矩阵matrix进行Z字形编排后的内容. 原矩阵: 输出形式: 算法分析与详细解答: 要解决这样一个问题,可能一开始无从下手,但 ...

  6. 一条常用的 Sql

    select  *   from  table  where  条件1 .... group  by  字段......  Having  条件1.....Limit 0,10; 1. 根据where ...

  7. 用DBCC CHECK修复SQL2000的数据库一致性问题

    ) set @databasename='需要修复的数据库实体的名称' exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户 ...

  8. day 34线程的其他方法,线程池

    线程的其他方法:  from threading import Thread,current_thread: currrent_thread().getName()  获取线程的名称 current_ ...

  9. CTF-安恒19年二月月赛部分writeup

    CTF-安恒19年二月月赛部分writeup MISC1-来玩个游戏吧 题目: 第一关,一眼可以看出是盲文,之前做过类似题目 拿到在线网站解一下 ??41402abc4b2a76b9719d91101 ...

  10. 使用jdk生成自签发证书(过程总结)

    前言: 最近在做华为NB-IoT接口开发,需要用到双向认证,就去学了一下. 然后我将过程总结了一下. 相关华为论坛链接:http://developer.huawei.com/ict/forum/th ...