洛谷P1174 打砖块 | CCPC2021网络赛8.28 1011 动态规划 分组背包
本文学习自洛谷社区
喜提CCPC2021网络赛原题
题意相当于是要在每一列中选若干个砖块打掉,消耗所需的子弹数并得到对应的得分。最大化k个子弹能得到的最大得分。
预处理出第 \(i\) 列 \(j\) 个子弹能得到的最大得分,记为\(sum[i][j]\),那么这可以转为一个分组背包问题。但一个小问题是,在没有子弹时,你不能在打掉'Y'格,因此我们需要追踪最后一发子弹的去向。
记\(sum[i][j][0]\)表示第\(i\)列用\(j\)个子弹,全局的最后一发子弹不打在这一列能得到的最大得分,\(sum[i][j][1]\)表示第\(i\)列用\(j\)个子弹,全局的最后一发子弹打在这一列的最大得分。
最后一发子弹没有打在这一列的话,预处理时能从第\(n\)行不断往上爬直到无法爬为止,遇到'Y'就能以0的代价拿下。但若最后一发子弹打在这一列,碰上'N'时,\(sum[i][j][1]\)需要用s\(um[i][j−1][0]\)更新。据此可以写出预处理代码如下:
for (int i = 1; i <= m; i++) {
for (int j = n, cnt = 0; j >= 1; j--) {
if (c[j][i] == 'Y') {
sum[i][cnt][0] += a[j][i];
} else {
cnt++;
sum[i][cnt][0] = sum[i][cnt-1][0] + a[j][i];
sum[i][cnt][1] = sum[i][cnt-1][0] + a[j][i];
}
}
}
然后考虑修改后的“分组背包”。记\(dp[i][j][0]\)表示前\(i\)列\(j\)发子弹,最后一发子弹不打在前i列能得到的最大得分,\(dp[i][j][1]\)表示前\(i\)列\(j\)发子弹,最后一发子弹打在前\(i\)列能得到的最大得分。转移有如下几种:
1.最后一发打在当前列,即\(l>0\)
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-l][0]+sum[i][l][1]);
2.最后一发打在前\(i\)列,但不是当前列,即\(j−l>0\)
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-l][1]+sum[i][l][0]);
3.最后一发不打在前ii列
dp[i][j][0] = max(dp[i][j][0], dp[i-1][j-l][0]+sum[i][l][0]);
for (int i = 1; i <= m; i++) {
for (int j = 0; j <= k; j++) { //一共有j发子弹
for (int l = 0; l <= min(j, n); l++) { //尝试在这一列打l发
//case 3
dp[i][j][0] = max(dp[i][j][0], dp[i-1][j-l][0]+sum[i][l][0]);
if (l) { //case 1
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-l][0]+sum[i][l][1]);
}
if (j-l) { //case 2
dp[i][j][1] = max(dp[i][j][1], dp[i-1][j-l][1]+sum[i][l][0]);
}
}
}
}
然后就可以过了。
洛谷P1174 打砖块 | CCPC2021网络赛8.28 1011 动态规划 分组背包的更多相关文章
- 洛谷P1174 打砖块
题目描述 小红很喜欢玩一个叫打砖块的游戏,这个游戏的规则如下: 在刚开始的时候,有n行*m列的砖块,小红有k发子弹.小红每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分. ...
- 洛谷 P1174 打砖块
题目描述 小红很喜欢玩一个叫打砖块的游戏,这个游戏的规则如下: 在刚开始的时候,有n行*m列的砖块,小红有k发子弹.小红每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分. ...
- 洛谷 P1064 金明的预算方案【有依赖的分组背包】
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱 ...
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
- 洛谷P3376【模板】网络最大流 ISAP
这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...
- CCPC2021网络赛 1012 Remove
2021CCPC网络赛 1012 Remove 题意 给定 \(n, m\),然后再给 \(m\) 个素数,问对于所有 \(i \in [1,n]\),将 \(i\) 操作至 \(0\) 的最小操作数 ...
- 【洛谷2304_LOJ2134】[NOI2015]小园丁与老司机(动态规划_网络流)
题目: 洛谷 2304 LOJ 2134 (LOJ 上每个测试点有部分分) 写了快一天 -- 好菜啊 分析: 毒瘤二合一题 -- 注意本题(及本文)使用 \(x\) 向右,\(y\) 向上的「数学坐标 ...
- 【洛谷2904/BZOJ1617】[USACO08MAR]跨河River Crossing(动态规划)
题目:洛谷2904 分析: 裸dp-- dp方程也不难想: \(dp[i]\)表示运\(i\)头牛需要的最短时间,\(sum[i]\)表示一次运\(i\)头牛(往返)所需的时间,则 \[dp[i]=m ...
- 洛谷P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
- 洛谷 P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
随机推荐
- 介绍一个我开源的项目:一键部署 VictoriaMetrics 群集
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我实在是非常喜欢这个强大的 metrics 监控组件 Vi ...
- ProtocolBuffer详细教程
下面大佬写的特别详细,直接参考他的吧! 推荐参考大佬写的ProtocolBuffer详细教程
- Scrapy创建项目、爬虫文件
创建项目 执行命令 scrapy startproject <项目名> 项目结构 创建爬虫文件 方式一:通过命令生成 scrpay genspider <爬虫名(必须唯一)> ...
- Javascript Ajax总结——GET请求和POST请求
1.GET请求GET最常用于向服务器查询信息.可在URL末尾添加查询字符串参数.XHR中,传入open()方法的URL末尾的查询字符串必须经过正确的编码,使用encodeURIComponent()编 ...
- GPT Zero 是什么?
from https://openaigptguide.com/gptzero/ 在人工智能技术飞速发展的今天,人们对于文字内容的准确性和可信度要求越来越高.例如在学术研究领域,防止抄袭和造假是非常重 ...
- 一步一步教你写kubernetes sidecar
本文分享自华为云社区<一步一步教你写kubernetes sidecar>,作者: 张俭. 什么是sidecar? sidecar,直译为边车. 如上图所示,边车就是加装在摩托车旁来达到拓 ...
- 直击云栖|践行数据化运维,云掣重新解读MSP
2020年云栖大会百城汇·杭州站,云掣MSP专场圆满落幕! 本次云栖大会·云掣MSP专场以"数据智能,智能运维"为主题,主要聚焦企业云化转型演进趋势,云上运维全景监控以及云原生云环 ...
- 去年最火的 JS 开源项目「GitHub 热点速览」
近日,「Best of JS」发布了过去一年在 GitHub 上 Star 数增速最快的 JavaScript 开源项目(2023 JavaScript Rising Stars),前 10 的开源项 ...
- STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器
本实验主要使用STM32CubeMX软件配置STM32F407开发板实现RTC周期唤醒.闹钟A/B事件功能,周期唤醒中输出RTC时间,闹钟A/B事件发生时利用串口输出闹钟A/B事件发生提示 1.准备材 ...
- GDAL数据集写入空间坐标参考
目录 1. 概述 2. 栅格数据 3. 矢量数据 1. 概述 可以通过GDAL给地理数据写入空间参考信息,不过要注意的是GDAL给矢量数据和栅格数据写入空间坐标参考的接口不太一样. 2. 栅格数据 实 ...