区间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)\) 的做法就 ...
随机推荐
- Ruby print
Ruby print
- UVA - 1476 Error Curves 三分
Error Curves Josephina is a clever girl and addicted to Machi ...
- Linux就该这么学 20181003(第三章管道符)
参考链接https://www.linuxprobe.com/ 输入输出重定向 标准输入重定向STDIN 文件描述符0 默认键盘输入 标准输出重定向STOUT 文件描述符1 默认输出到屏幕 错误输出重 ...
- xBIM 高级02 插入复制功能
系列目录 [已更新最新开发文章,点击查看详细] IFC 模型中的合并和删除实体是一个非常重要的任务,因为 IFC 不是一个分层结构.它是一个复杂的结构,具有潜在的循环关系,是一个双向导航.在单 ...
- Maven远程仓库:pom依赖以及jar包下载
Maven远程仓库:pom依赖xml配置以及jar包下载: 地址1: http://mvnrepository.com/ 地址2: http://172.16.163.52:8081/nexus/#w ...
- RXjava的简介
API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式面向的需求是:举一个例子,警察在小偷实施作案的时候实施抓捕,在这一个例子中警察是观察者,小偷是被观察者.但是程序的观察者模式和这个还是有 ...
- dialog.setCancelable与setCanceledOnTouchOutside的区别
dialog.setCancelable(false); dialog弹出后会点击屏幕或物理返回键,dialog不消失 dialog.setCanceledOnTouchOutside(false); ...
- 洛谷P2770 航空路线问题 最小费用流
Code: #include<cstdio> #include<iostream> #include<algorithm> #include<vector&g ...
- php xml 的基本操作类
class xmlMessage{ protected $doc; protected $rootKey; public function __construct() { $this->doc ...
- 学习参考:《Python语言及其应用》中文PDF+英文PDF+代码
学习简单的数据类型,以及基本的数学和文本操作,学习用Python内置的数据结构来处理数据: 掌握Python的代码结构和函数的用法:使用模块和包编写大规模Python程序:深入理解对象.类和其他面向对 ...