DP刷题总结-2
同步于Luogu blog
T1 AT_joisc2007_buildi ビルの飾り付け (Building)
简化题意
最长上升子序列模板
分析
\(O(n^2)\)做法
考虑DP
- 定义状态:\(dp_i\)表示以\(i\)结尾的最长上升子序列长度
- 确定答案:\(\max{dp_i}\)
- 状态转移:对于每个\(a_i\):
(1)当\(a_i>a_j(j<i)\)从以第\(j\)个数结尾的地方再接一个数,即\(dp_j+1\)
(2)自己单独成一个子序列 - 边界条件:\(dp_i=1\)(每个数都能单独成一个子序列)
\(O(n\log n)\)做法
考虑贪心(往死里贪)
所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长
所以创建一个数组\(c\),用来存贮现在的最长上升子序列中的元素
对于每个\(a_i\),可以在\(c\)数组中找到一个第一个比他大的数,那么这个数就能替换掉\(c\)数组中的那个数,而\(dp_i\)的答案就是找到的数的下标,因为前面都是比他小的数,自然的,他也可以接在这些数后面
但是这样可能还是要扫一遍\(c\)数组,但我们能发现,\(c\)数组永远是单调递增的!所以使用二分大法,时间复杂度\(O(n\log n)\)
P.S.:\(c\)一定要初始化为无穷大,因为数要越小越好
Code
T2 AT_abc281_d [ABC281D] Max Multiple
分析
- 定义状态:\(dp_{i,j,p}\)表示前\(i\)个数,选了\(j\)个,余数为\(p\)时的最大和
- 答案:\(dp_{n,k,0}(dp_{n,k,0}\geq0)\),否则为\(-1\)
- 方程:
(1)不选这个数:\(dp_{i-1,j,p}\)
(2)选这个数:\(dp_{i-1,j-1,(p-a_i)\mod d }+a_i\) - 边界:\(dp_i=-\inf\),\(dp_{0,0,0}=0\)
Code
T3 AT_abc369_d [ABC369D] Bonus EXP
题意简化
有\(n\)只怪物,每只怪物有一个数值\(a_i\),对于每只怪物,你有两种选择:
- 放走他,获得\(0\)经验
- 击败他,获得\(a_i\)经验,特别的,如果这只怪兽是你击败的偶数只怪物,你还可以额外获得\(a_i\)经验
求最后你能获得多少经验
分析
- 定义状态:\(dp_{i,0/1}\)表示前\(i\)个怪物,选了奇数/偶数个怪物的最大经验
- 答案\(\max(dp_{n,0},dp_{n,1})\)
- 状态转移方程:
(1)选第\(i\)个怪物,且为奇数个:\(\max(dp_{i-1,0},dp{i-1,1}+a_i)\)
(2)选第\(i\)个怪物:\(\max(dp_{i-1,1},dp_{i-1,0}+2\times a_i)\) - 边界:由于\(a\)可能有负数,所以dp设为负无穷
Code
还有两题有时间补上
DP刷题总结-2的更多相关文章
- DP刷题记录(持续更新)
DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...
- DP刷题记录
目录 dp刷题记录 codeforces 706C codeforces 940E BZOJ3997 POJ2279 GYM102082B GYM102082D codeforces132C L3-0 ...
- DP刷题
http://blog.csdn.net/a1dark/article/details/17115137
- DP刷题记录(长期更新)
bzoj 2748 一个吉他手,有一个初始音量,有一个音量最大值max. 给定n个音量变化量,从第一个变化量开始,可以选择加上或者减去变化量.途中音量不能低于0,不能超过max. 求最后能达到的最大音 ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- 刷题总结——bzoj1725(状压dp)
题目: 题目描述 Farmer John 新买了一块长方形的牧场,这块牧场被划分成 N 行 M 列(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地. FJ ...
- ACM :漫漫上学路 -DP -水题
CSU 1772 漫漫上学路 Time Limit: 1000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Submit ...
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- Leetcode OJ 刷题
Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...
随机推荐
- 11. SpringCloud Alibaba Seata 分布式事务处理的详细使用以及详细剖析
11. SpringCloud Alibaba Seata 分布式事务处理的详细使用以及详细剖析 先看一个问题,引出 Seata 单机单库(多表)处理事务示意图 分布式微服务架构下的数据库事务示意图: ...
- 从找零钱问题到三数之和:一道经典面试算法题的全面剖析|LeetCode 15 三数之和
LeetCode 15 三数之和 点此看全部题解 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中) 生活中的算法 想象你是一个收银员,顾客给了你一张100元钱,商品只要85元. ...
- Iceberg的Copy on Write和Merge On Read介绍
一.默认的Copy on Write Copy no Write模式指的是在进行更新数据时,先将数据拷贝出来进行相应的更新,再替换掉原先的数据 二.Merge On Read读取时合并 在v2版本才支 ...
- Linux编译方式安装redis
redis安装1.安装gcc-c++编译环境yun install gcc-c++ 2.把redis上传到linux服务器 3.解压缩 tar -zxf redis-3.0.0.tar.gz 4. ...
- Clickhouse、Mysql、Presto数据库解析Json数据
一.Clickhouse解析Json 1.visitParamExtractBool(json,name) → 提取json中的name字段,返回UInt8,0或1 例:visitParamExt ...
- 在IDEA如何使用JProfiler性能分析
一.下载地址 https://www.ej-technologies.com/download/jprofiler/files 版本:11 激活码:L-J11-Everyone#speedzodiac ...
- C语言程序设计手写笔记
最近自己录了一个自学C语言系列,笔记发出来,视频还在传
- [BZOJ3159] 决战 题解
个人感觉各方面难度高于<在美妙的数学王国中畅游>,也不知道是不是求导的关系,这题 \(luogu\) 难度评级还更低.不过感觉这题作完对 \(LCT\) 理解更顺畅了. 前四个操作简单,关 ...
- mysql where条件:某时间字段为今天的sql语句
1.查询:注册时间为今天的所有用户数: select count(*) from customer where TO_DAYS(createtime) = TO_DAYS(NOW()) 2.获取当前时 ...
- 离线环境安装nodejs及npm库i5ting_toc(超详细,手把手教学一通百通)
一.离线环境先安装nodejs 1.在可联网的电脑上下载特定版本的 Node.js: 访问 Node.js 官方下载页面(https://nodejs.org/download/release/) ...