洛谷【P1854】花店橱窗布置
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】花店橱窗布置的更多相关文章
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- 洛谷 P1854 花店橱窗布置 【dp】
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 洛谷 P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 洛谷P1854 花店橱窗布置
题目 DP,直接递推比记忆化搜索简单. 定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值. 易得状态转移方程 \(dp[i][j]=max(dp[i-1][k]+a[i] ...
- 洛谷 P1854 花店橱窗布置 题解
Analysis 给定一个f*v的矩阵 要求从第一行走到第f行,每行取走一个数, 且该行所取的数必须必上一行所取的数的列数大 , 求所能取走的最大值 注意每一行所取走的数字的列数必须大于等该行的行号 ...
- [动态规划]P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- luogu P1854 花店橱窗布置
题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V是花瓶的数目.花束可以移动,并且每束花用1到F的整数标识 ...
- 题解 P1854 花店橱窗布置
把二维压成一维的DP了解一下... 传送门 (以纪念神经兮兮调了两天的一维DP(刷水题谋财害命)以及感谢学长的帮助@ydnhaha) 显然我们有二维的dp:f[i][j]代表第i盆花放到第j个位置 ; ...
- 【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 ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
随机推荐
- LINUX升级PHP版本至5.4.26
参考网址:http://www.itbulu.com/wdcp-php54.html文件:链接:http://pan.baidu.com/s/1slbbNxr 密码:s0yb 1.运行下载PHP版本文 ...
- angular路由传参和获取路由参数的方法
1.首先是需要导入的模块 import { Router } from "@angular/router";//路由传参用到 import{ActivatedRoute,Param ...
- 关于TCP传输的三次握手四次挥手策略
简单小总结: 一般为了能够准确无误地把数据送达目标处,TCP协议采用了三次握手策略.用TCP协议把数据包送出去后,TCP不会对传送后的情况置之不理,它一定会向对方确认是否成功送达. 注:握手过程中使用 ...
- 大专生自学html5到找到工作的心得
先做个自我介绍,我13年考上一所很烂专科民办的学校,学的是生物专业,具体的学校名称我就不说出来献丑了.13年我就辍学了,我在那样的学校,一年学费要1万多,但是根本没有人学习,我实在看不到希望,我就退学 ...
- python教程(三)·函数进阶(上)
在介绍了函数定义的方法后,再来介绍一些进阶知识 参数收集 有时候我们需要参数的数量是任意的,比如print函数的参数的数量是任意的,print函数的内部实现我们不探究,但是单单是参数数量可变这一方面实 ...
- [Golang学习笔记] 07 数组和切片
01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...
- RandomAccessFile java
RandomAccessFile 用来支持读写随机存取文件的类.提供“文件指针”,类似于游标和下标,使用getFilePointer()方法获得,利用seek()方法设置下标. public Rand ...
- Python之路(四)--->list、元组、字典
好久没有更新了,感觉自己写的东西并没有太多人看,可能是因为写的不好,也可能是太基础了.学习是一个漫长的过程,结果结果固然重要,但是更重要的是在学习的过程中所学到方法,这些方法在以后的生活还是工作中都能 ...
- 20155218 《Java程序设计》实验二(Java面向对象程序设计)实验报告
20155218 <Java程序设计>实验二(Java面向对象程序设计)实验报告 一.实验内容及步骤 (一)单元测试 主要学习安装和使用junit来测试编写的程序,并学习以TDD(Test ...
- 【转】 线段树完全版 ~by NotOnlySuccess
载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章 ...