![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
区间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 longconst 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 · 82 阅读 · 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 · 424 阅读 · 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 · 342 阅读 · 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 · 269 阅读 · 0 评论 -
不止代码:ybtoj-棋盘分割(二维区间dp)
题目描述将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了n-1次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。 (每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。求出均方差的最小值。其中,均方差的定义为:(里面的括号应该还有一个平方,不然固输0岂不美哉)数据范围1<n<15,所有数均为不大于原创 2021-03-15 00:01:04 · 142 阅读 · 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 · 293 阅读 · 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 · 184 阅读 · 0 评论 -
P4342:[IOI1998]Polygon(区间dp)
一道警钟一样的好题解析乍一看:“这不就能量项链嘛,这也蓝?”然后就愉快的WA掉了…qwq让我们回归本源,在什么时候可以动态规划?“局部最优解可以带动全局最优解的时候,我们可以使用动态规划算法”然而在本题中,却不满足这个条件!局部的最大值不一定会导致全局的最优!当另一边为负时,局部取最大反而是最差的结果所以应该维护一个最小值,考虑从两方面进行转移以后写类似的题一定要多想一想,不能想当然代码#include<bits/stdc++.h>using namespace.原创 2021-11-12 15:21:23 · 222 阅读 · 0 评论