区间dp
当dp转移需要兼顾两边时,线性dp往往无法解决,此时就需要区间dp
wind__whisper
qwq
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
洛谷P3607:Subsequence Reversal P(区间dp)
解析 很巧妙的题 我一开始的dp设计其实是可以的 只是我误认为它的转移需要n^2 然后尝试把它压掉一维结果越跑越远… 但一个技巧是只从相邻的状态转移 使转移变成O1 代码 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=52; const int M=1e6+100; ll read(){ ll x=0,f=1;char c=getchar(); while(!isdigit(c)原创 2021-11-05 11:46:09 · 151 阅读 · 0 评论 -
不止代码:乘法游戏 题解(区间dp)
题目描述 乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌。最后一次移动后,这里只剩下两张牌。 你的目标是使得分的和最小。 解析 区间dp 定义dp[i][j]是把i j 之间所有数去掉的代价最小值 那么显然: if(j==i+1) return 0; 而当ij中有数时,我们可以枚举i j之间取的最后一个数的位置k 显然: i<k<j 那么这个过程就是把i k之间的书都取完再把k j之间的原创 2021-03-11 20:12:27 · 558 阅读 · 0 评论 -
不止代码:ybtoj-消除木块(区间DP)
题目描述 n个木块排成一列,每个木块都有一个颜色。 每次,你都可以点击一个木块,这样被点击的木块以及和它相邻并且同色的木块就会消除。 如果一次性消除了k个木块,那么就会得到k*k分。 给定你一个游戏初始状态,请你求出最高得分是多少。 解析 区间dp 首先可以把同色合并,从而将数列转化为一个由若干段组成的新的数列 用dp[i][j][k]表示新数列中在加上后面有k个与第j段颜色相同的木块的情况下,第i到j段的最大得分 那么就可以不断把第r段尝试与之前的同色段连接消除,并继续递归: for(int i=l;i&原创 2021-03-14 22:21:14 · 488 阅读 · 0 评论 -
不止代码:恐狼后卫(ybtoj-区间dp)
文章目录题目描述解析代码thanks for reading! 题目描述 一代炉石的眼泪啊 解析 用dp[i][j]表示i与j之间的全部消掉(不含两端)的最小花费 然后枚举中间最后杀死的狼就行了 本题没有一次AC,因为一开始dp定义成了包含两端,然后因为还受再外面的影响,写的很乱 一次不成后经过思考,啊哈! 正解思路就诞生了 所以寻找适用与题目的dp定义非常重要 正如之前的积木消消乐一样 代码 #include<bits/stdc++.h> #define ll long long #def原创 2021-04-24 17:47:50 · 466 阅读 · 0 评论 -
不止代码:ybtoj-棋盘分割(二维区间dp)
题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了n-1次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。 (每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。求出均方差的最小值。 其中,均方差的定义为: (里面的括号应该还有一个平方,不然固输0岂不美哉) 数据范围 1<n<15,所有数均为不大于原创 2021-03-15 00:01:04 · 234 阅读 · 0 评论 -
最小代价(区间dp)(ybtoj)
文章目录题目描述解析 题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数值在[a,b]之间的数全部消掉需要的最小价值 (为了本题要对数列离散化一下,f里的ab存的是数的按大小的编号) 关键在于这个f的设计 之后后面就好办了,正常转移即可 事后诸葛: 为什么想到这么设计f呢? 因为这么能做出来 直观一点的想的话,我们想要转移,关键在于区间的最值 所以有此 ...原创 2021-07-19 20:22:25 · 429 阅读 · 0 评论 -
不止代码:生日欢唱(ybtoj-区间dp)
文章目录题目描述解析代码thanks for reading! 题目描述 解析 '这题挺好的 思路:dp[i][j]表示必须把i和j配对,可达到的最大值 首先: dp[i][j]=dp[i-1][j-1]+a[i]*b[j]; 然后可以分别尝试把男生或女生往前放弃一段: for(int k=i-1;k>=1;k--){//男不要k到i-1 dp[i][j]=max(dp[i][j],dp[k-1][j-1]+a[i]*b[j]-(suma[i-1]-suma[k-1])*(suma[i-原创 2021-04-24 18:50:56 · 292 阅读 · 0 评论 -
P4342:[IOI1998]Polygon(区间dp)
一道警钟一样的好题 解析 乍一看: “这不就能量项链嘛,这也蓝?” 然后就愉快的WA掉了… qwq 让我们回归本源,在什么时候可以动态规划? “局部最优解可以带动全局最优解的时候,我们可以使用动态规划算法” 然而在本题中,却不满足这个条件! 局部的最大值不一定会导致全局的最优! 当另一边为负时,局部取最大反而是最差的结果 所以应该维护一个最小值,考虑从两方面进行转移 以后写类似的题一定要多想一想,不能想当然 代码 #include<bits/stdc++.h> using namespace.原创 2021-11-12 15:21:23 · 321 阅读 · 0 评论
分享