区间dp学习笔记
怎么办,膜你赛要挂惨了,下午我还在学区间\(dp\)!
不管怎么样,计划不能打乱\(4\)不\(4\)。。
区间dp
模板
为啥我一开始就先弄模板呢?因为这东西看模板就能看懂。。。
for(int i=2;i<=len;i++)//枚举区间长度
{
for(int l=1,r=l+len-1;r<=n;l++,r++)//枚举左端点和右端点
{
//以下你可以搞一下事情
for(int k=l;k<r;k++)
{
//以下你还可以搞一下事情
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
}
}
}
以上就是区间dp的大体模板,至于为啥,感性理解一下就好了
例题
石子合并加强版
为啥我一开始就弄加强版呢?因为普通版就在加强版里面哇\(qwq\)
传送门
这道题目是说一个环形操场,然后合并成一堆的最大值和最小值
注意加粗的字体,环形操场?
好吧,这就是一个环形\(dp\),通常的就是复制一遍,断环为链,别问我为啥是这样
然后就是状态转移方程。\(dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r])\)与\(dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r])\)
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1000;
int n,a[1000],dpmax[N][N],dpmin[N][N],sum[N];
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]),a[i+n]=a[i];
for(int i=1; i<=n*2; i++)
sum[i]=sum[i-1]+a[i];
memset(dpmin,0x3f,sizeof(dpmin));
for(int i=1; i<=n*2; i++)dpmin[i][i]=0;
for(int len=2; len<=n; len++)
{
for(int l=1,r=len+l-1; r<=n*2; l++,r++)
{
for(int k=l; k<r; k++)
dpmax[l][r]=max(dpmax[l][r],dpmax[l][k]+dpmax[k+1][r]+sum[r]-sum[l-1])
,dpmin[l][r]=min(dpmin[l][r],dpmin[l][k]+dpmin[k+1][r]+sum[r]-sum[l-1]);
}
}
int maxn=0,minn=0x7fffffff;
for(int i=1; i<=n; i++)minn=min(minn,dpmin[i][i+n-1]),maxn=max(maxn,dpmax[i][i+n-1]);
cout<<minn<<endl<<maxn;
}
括号匹配问题
这道题也是\(dp\)问题,不算特别的裸,毕竟用到了字符串。
因为我们要判断括号的合法性,所以我们在枚举左端点和右端点的时候,只要合法,括号序列就\(+2\),也就是\(dp[l][r]=dp[l+1][r-1]+2\)这个看不懂的人不多吧
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
char s[255];
int dp[300][300];
int main()
{
while(1)
{
cin >> s+1;
if(s[1]=='e')break;
memset(dp,0,sizeof(dp));
int len=strlen(s+1);
for(int i=2; i<=len; i++)
{
for(int l=1,r=i+l-1; r<=len; l++,r++)
{
if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))
dp[l][r]=dp[l+1][r-1]+2;
for(int k=l; k<r; k++)
{
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
}
}
}
printf("%d\n",dp[1][len]);
}
}
关于区间\(dp\)还有一个东西叫做四边形不等式优化,\(emmm\)这东西以后再学
区间dp学习笔记的更多相关文章
- 区间DP 学习笔记
前言:本人是个DP蒟蒻,一直以来都特别害怕DP,终于鼓起勇气做了几道DP题,发现也没想象中的那么难?(又要被DP大神吊打了呜呜呜. ----------------------- 首先,区间DP是什么 ...
- 数位DP学习笔记
数位DP学习笔记 什么是数位DP? 数位DP比较经典的题目是在数字Li和Ri之间求有多少个满足X性质的数,显然对于所有的题目都可以这样得到一些暴力的分数 我们称之为朴素算法: for(int i=l_ ...
- DP学习笔记
DP学习笔记 可是记下来有什么用呢?我又不会 笨蛋你以后就会了 完全背包问题 先理解初始的DP方程: void solve() { for(int i=0;i<;i++) for(int j=0 ...
- 树形DP 学习笔记
树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...
- 斜率优化DP学习笔记
先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...
- 区间DP学习总结
这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如 ...
- dp学习笔记(各种dp,比较杂)
HDU1176 中文题意不多解释了. 建一个二维dp数组,dp[ i ][ j ]表示第 i 秒落在 j 处一个馅饼.我们需要倒着DP,为什么呢,从 0秒,x=5处出发,假如沿数组正着往下走,终点到哪 ...
- 动态 DP 学习笔记
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
- [总结] 动态DP学习笔记
学习了一下动态DP 问题的来源: 给定一棵 \(n\) 个节点的树,点有点权,有 \(m\) 次修改单点点权的操作,回答每次操作之后的最大带权独立集大小. 首先一个显然的 \(O(nm)\) 的做法就 ...
随机推荐
- CSS3弹性布局内容对齐(justify-content)属性使用具体解释
内容对齐(justify-content)属性应用在弹性容器上.把弹性项沿着弹性容器的主轴线(main axis)对齐. 该操作发生在弹性长度以及自己主动边距被确定后. 它用来在存在剩余空间时怎样加以 ...
- linux /proc/cpuinfo 文件描写叙述
processor :系统中逻辑处理核的编号.对于单核处理器.则课觉得是其CPU编号,对于多核处理器则能够是物理核.或者使用超线程技术虚拟的逻辑核 vendor_id :CPU制造商 cpu fami ...
- Loopback測试软件AX1用户手冊 V3.1
点击:AX1 软件下载 1. 什么是AX1 AX1程序是基于windows的PC程序,用来评估 iinChip™的性能,也即是wiznet的硬件TCP/IP芯片. AX1通过网络与iinChip™评估 ...
- HDU2188 悼念512汶川大地震遇难同胞——选拔志愿者
悼念512汶川大地震遇难同胞--选拔志愿者 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Oracle Table Function
Oracle Table Function在Oracle9i时引入.完美的兼容了view和存储过程的长处: 应用举例: 1.Table()函数: set feedback off create or ...
- 安卓更新Toast流程图
今天照着书写了个程序为了理解更深刻特意画了一个流程图分享给大家 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5 ...
- node11---相册
app.js /* littleAlbum --.idea --controller(控制层相当于action层) --package.json --router.js --models(做事的是mo ...
- VC++基于CXImage库实现缩略图
一般的图像处理软件都对读入程序的图像文件建一个缩略图的列表,像ACDSee那样.笔者最近在做一个图像处理的项目,处理的原始数据就是图像文件.从项目一开始就想做一个缩略图,但一直苦于技术水平有限,且时间 ...
- Batch脚本获取日期SET YEAR=%date:~10,4%
在batch脚本中我们可以通过下面的语句来对日期进行操作: SET YEAR=%date:~10,4% SET MONTH=%date:~4,2% SET DAY=%date:~7,2% SET HO ...
- android adb command
一.adb启动activity: $ adb shell$ am start -n {包(package)名}/{包名}.{活动(activity)名称} 如:启动浏览器 # am start -n ...