[总结-动态规划]经典DP状态设定和转移方程
马上区域赛,发现DP太弱,赶紧复习补上。
#普通DP
CodeForces-546D Soldier and Number Game 筛法+动态规划
待补
UVALive-8078 Bracket Sequence
问以每个字符为左端点的最长括号序列是多长。(包括尖、花、中小括号)
状态:设dp[i]为从i开始的括号序列最长长度。
转移:以i+1为起点的最长串后边的字符若与左括号匹配,答案是加上这个字符后边的最长串,否则为零。
HDU-1024 Max Sum Plus Plus
给一个序列,找m个不重叠的连续子串,使这几个子串内的元素和的和最大。
即sum(i1, j1)+sum(i2, j2)+...+sum(im, jm)最大
状态:dp[i][j]表示选择第i个元素,当前是第j个子串。
转移:dp[i][j]=max(dp[i-1][j], dp[k][j-1])+num[i], (k<=i-1)
优化:
- 维护max(dp[k][j-1])
- 滚动数组去掉第一维
HDU-4055 Number String
给一个序列相邻元素各个上升下降情况('I'上升'D'下降'?'随便),问有几种满足的排列。
例:ID
答:2 (231和132)
状态:dp[i][j]表示满足以j为结尾的,长度为i的排列方案数。
转移:
str[i]=='I': dp[i][j]=sum(dp[i-1][k]) (1<=k<=j-1)
str[i]=='D': dp[i][j]=sum(dp[i-1][k]) (j<=k<=i)
str[i]=='?': dp[i][j]=sum(dp[i-1][k]) (1<=k<=i)
HDU-5009 Paint Pearls
给一串序列,可以任意分割多次序列,每次分割的代价是被分割区间中的数字种数。
求分割区间的最小代价。n<=5e4
例:1 3 3
答:2
状态:dp[i]表示从0到i序列的分割代价。
转移:dp[i]=min(dp[j]+cnt[j-1][i]^2)
优化:双向链表删除元素,优化掉j的选择
UVA-11584 Partitioning by Palindromes
给一个字符串序列,问回文串的最少个数。
例:aaadbccb
答:3(分为aaa, d, bccb三份)
状态:dp[i]表示从0到i的回文串最少个数
转移:dp(i)=min( dp(j-1)+1 | [j, i]是回文串 )
优化:预处理回文串,复杂度降至O(n^2)
#区间DP
HYSBZ-1566 管道取珠
题意相见 https://www.cnblogs.com/tanglizi/p/9489073.html
当面对\sum a^2的时候,把情形分成两种。当这两种情景(状态)相同时,方案数即为a^2。
状态和方程待补。
LightOJ-1422 Halloween Costumes
想参加聚会,每场聚会需要穿对应的衣服。
现在有需要参加的聚会的衣服序列。
对策是可以穿着多件衣服,按聚会不同脱下即可;或者直接在当前衣服上在加一件衣服。
问最少穿过几件衣服。
状态:dp[i][j]为第i到第j聚会的穿衣最小数。
转移:dp[i][j]=min(dp[i][k]+dp[k+1][j-1]), dp[i][j]=dp[i][j-1]+1
UVA-1331 Minimax Triangulation
三角剖分系列。
给一个任意多边形,把它分为多个三角形。
求某方案中最大的三角形是各方案中最小的面积的三角形面积。
状态:dp[i][j]为从i到j顺时针区间的多边形最小方案的值。
转移:dp[i][j]=min(dp[i][j], max(Area(i, k, j), dp[i][k], dp[k][j]))
HDU-5693 D Game
待补好题
UVA-10003 Cutting Sticks
有根棍子,上面有些分割点(n<50),每次按分割点切割棍子时,费用为当前棍子的长度。
问有什么样的顺序切完分割点,使总费用最小。
状态:dp[i][j]表示分割点ij之间棍子的最小切割费用。
转移:dp[i][j]=min(dp[i][k]+dp[k+1][j])+pos[j]-pos[i]
ZOJ-3537 Cake
三角剖分系列。
给一个多边形,需要分成若干三角形,且每分一次边有代价|xi+xj|*|yi+yj|%p。
问总代价最小值。
状态:dp[i][j]表示第i节点到第j节点围城的多边形最小值。
转移:dp[l][j]=min(dp[l][k]+dp[k][j]+cost(l, k)+cost(k, j));
三角剖分边界:dp[i][j]=INF, dp[i][i]=dp[i][i+1]=0
三角剖分原理:dp(i, j)(包含点ij且i<j)表示顺时针从i到j的凸多边形最值,则ijk可表示三角形顶点。
POJ-1651 Multiplication Puzzle
矩阵链乘问题
给一个序列,每次取一个元素的代价是c[i-1]c[i]c[i+1],问取到剩下2个元素的代价最小值。
状态:设dp(i, j)表示i到j的元素全部选择后的最小值,要注意是全部元素没有被选择过,且端点左右的元素没有被选过
转移:dp(i, j)=min(dp(i, k-1)+dp(k+1, j)+c[l-1] * c[k] * c[r+1])
注意:
- k的取值范围,按定义来就是i~j
- 为何状态转移是取k,而其他两数在端点?
我们可以证明,这样的状态转移包含了所有取数情况,而取(k-1, k, k+1)(先取k元素)是明显不可行的,
因为接下来区间端点代价计算就是错误的。 - 边界条件问题,我们一定要分析区间有0, 1, 2, 3个值的情形。我们发现l>r时,即上次的k选择在了端点上,这部分代价在上一层已经计算完毕。l==r时,按定义发现只能有一种三元组。
POJ-2955 Brackets
给一个可能合法的括号序列(包含中小括号),问最长合法子串最长长度。
貌似可以用简单dp的方法?
状态:dp[i][j]表示i到j的最长长度。
转移:
dp[i][i+len]=max(dp[i][i+len], dp[i][k]+dp[k+1][i+len])
dp[i][i+len]=max(dp[i][i+len], dp[i+1][i+len-1]+2*ismatch(i, i+len))
以下待补:
#概率DP
#树形DP
#数位DP
#背包问题
#典型DP
[总结-动态规划]经典DP状态设定和转移方程的更多相关文章
- DP 状态 DP 转移方程 动态规划解题思路
如何学好动态规划(2) 原创 Gene_Liu LeetCode力扣 今天 算法萌新如何学好动态规划(1) https://mp.weixin.qq.com/s/rhyUb7d8IL8UW1IosoE ...
- POJ 1185 炮兵阵地(经典的状态压缩DP)
题意:中文题. 思路,经典的状态压缩题目. 由于列长比较小,我们可以以行为阶段用状态压缩来做. 由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系.这样如果用j,k,l分 ...
- nyist oj 311 全然背包 (动态规划经典题)
全然背包 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 直接说题意,全然背包定义有N种物品和一个容量为V的背包.每种物品都有无限件可用.第i种物品的体积是c,价值是 ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- dp状态压缩
dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状 ...
- 动态规划——区间DP,计数类DP,数位统计DP
本博客部分内容参考:<算法竞赛进阶指南> 一.区间DP 划重点: 以前所学过的线性DP一般从初始状态开始,沿着阶段的扩张向某个方向递推,直至计算出目标状态. 区间DP也属于线性DP的一种, ...
- HDU 1003 Max Sum --- 经典DP
HDU 1003 相关链接 HDU 1231题解 题目大意:给定序列个数n及n个数,求该序列的最大连续子序列的和,要求输出最大连续子序列的和以及子序列的首位位置 解题思路:经典DP,可以定义 ...
- poj1458 求最长公共子序列 经典DP
Common Subsequence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 45763 Accepted: 18 ...
- Bomb HDU 3555 dp状态转移
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意: 给出一个正整数N,求出1~N中含有数字“49”的数的个数 思路: 采用数位dp的状态转移方程 ...
随机推荐
- redis-快照
rdb模式,默认模式 aof模式 如何配置aof模式 第一步:开启是否追加: Please check http://redis.io/topics/persistence for more info ...
- [bzoj2466][中山市选2009]树_树形dp
树 bzoj-2466 中山市选-2009 题目大意:给定一棵树,每一个点有一个按钮和一个灯泡.如果按下一个点的按钮那么和这个点直接相连的点包括这个点的灯泡的状态会改变.如果是点亮就会变成熄灭,如果 ...
- iOS不同版本号适配问题(#ifdef __IPHONE_7_0)
部分參考http://www.cnblogs.com/ios8/p/ios-version-com.html 以下举个简单的样例来说明在iOS7.0和iOS6.1(以及更低版本号)之间的适配问题(用的 ...
- 【cl】eclipse配置svn
查看Eclipse版本号 http://jingyan.baidu.com/article/020278118660e81bcd9ce545.html Window>preferences输入S ...
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
和LeetCode 207. Course Schedule(拓扑排序-求有向图中是否存在环)类似. 注意到.在for (auto p: prerequistites)中特判了输入中可能出现的平行边或 ...
- C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历
1. 对角线元素的屏蔽 使用 if + continue 实现对对角线元素的屏蔽 for u in range(n): for v in range(n): if u == v: continue . ...
- 【CQOI 2009】 余数之和
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1257 [算法] k mod i = k - [k / i] * i 所以 (k mo ...
- golang iris下面的websocket
最近要做后台主动推送:(iris框架,封装的有wesocket,刚开始以为直接拿过来用,结果不是现在贴一下代码,写一下遇到的坑) func main() { app := iris.New() ...
- Triangle 1.6 (A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator)
Triangle 一个二维高质量网格(mesh)生成器和Delaunay三角化工具. PSLG(Planar Straight Line Graph)约束Delaunay三角网(CDT)与Delaun ...
- AtCoder Regular Contest 069
1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...