算法笔记--区间dp
1.石子归并问题
dp[i][j]表示区间i到j合并所需的最小花费。
先求出小区间的最小花费,再转移到大的区间。
转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])
初始状态:dp[i][i]=0
模板:
for(int i=;i<=n;i++)cin>>a[i],sum[i]=sum[i-]+a[i]
for(int l=;l<=n;l++){
for(int i=;i+l-<=n;i++){
int j=i+l-;
dp[i][j]=INF;
for(int k=i;k<j;k++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j]+sum[j]-sum[i-]);
}
}
2.括号匹配问题
求最大括号匹配数
dp[i][j]表示i到j区间的最大括号匹配数
先求出小区间的最大括号匹配数,再转移到大区间。
状态转移:
dp[i][j]=dp[i+1][j-1]+2(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')
dp[i][j]=max(dp[i][k]+dp[k+1][j],dp[i][j])(i<=k<j)
初始状态:dp[i][j]=0
模板:
for(int len=;len<=s.size();len++){
for(int i=;i<s.size();i++){
int j=i+len-;
if(j<s.size()){
if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')dp[i][j]=dp[i+][j-]+;
for(int k=i;k<j;k++)
dp[i][j]=max(dp[i][k]+dp[k+][j],dp[i][j]);
}
}
}
记录路径,括号补全
用pos[i][j]记录i到j这段区间从哪个位置断开所要消耗的括号最少,然后从断点分开,递归输出答案。
模板:
void dfs(int l,int r){
if(l>r)return ;
if(l==r){
if(s[l]=='('||s[l]==')')putchar('('),putchar(')');
else putchar('['),putchar(']');
}
else{
if(pos[l][r]==-){
putchar(s[l]);
dfs(l+,r-);
putchar(s[r]);
}
else{
dfs(l,pos[l][r]);
dfs(pos[l][r]+,r);
}
}
}
for(int l=;l<=len;l++){
for(int i=;i+l-<len;i++){
int j=i+l-;
if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')dp[i][j]=dp[i+][j-]+,pos[i][j]=-;
for(int k=i;k<j;k++){
if(dp[i][k]+dp[k+][j]>=dp[i][j]){
dp[i][j]=dp[i][k]+dp[k+][j];
pos[i][j]=k;
}
}
}
}
dfs(,len-);
参考博客:http://blog.csdn.net/y990041769/article/details/24194605
算法笔记--区间dp的更多相关文章
- 算法笔记--数位dp
算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...
- [学习笔记]区间dp
区间 \(dp\) 1.[HAOI2008]玩具取名 \(f[l][r][W/I/N/G]\) 表示区间 \([l,r]\) 中能否压缩成 \(W/I/N/G\) \(Code\ Below:\) # ...
- 算法复习——区间dp
感觉对区间dp也不好说些什么直接照搬讲义了2333 例题: 1.引水入城(洛谷1514) 这道题先开始看不出来到底和区间dp有什么卵关系···· 首先肯定是bfs暴力判一判可以覆盖到哪些城市····无 ...
- 洛谷P1220 关路灯 题解 区间DP
题目链接:https://www.luogu.com.cn/problem/P1220 本题涉及算法:区间DP. 我们一开始要做一些初始化操作,令: \(p[i]\) 表示第i个路灯的位置: \(w[ ...
- 算法提高 矩阵乘法 区间DP
这是神题,n <= 1000,如果是极限数据普通的n^3区间DP怎么可能过?可偏偏就过了. 刘汝佳大哥的训练指南上面说的存在nlgn的算法解决矩阵链乘问题,可是百度都找不到.... AC代码 # ...
- 区间DP与贪心算法的联系(uav Cutting Sticks && poj Fence Repair(堆的手工实现))
由于,这两题有着似乎一样的解法所以将其放在一起总结比較,以达到更好的区分二者的差别所在. 一.区间DP uva的Cutting Sticks是一道典型的模板题. 题目描写叙述: 有一根长度为l的木棍, ...
- 蓝桥 ADV-232 算法提高 矩阵乘法 【区间DP】
算法提高 矩阵乘法 时间限制:3.0s 内存限制:256.0MB 问题描述 有n个矩阵,大小分别为a0*a1, a1*a2, a2*a3, ..., a[n-1]*a[n],现要 ...
- 51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)
题意:就是求石子归并. 题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化. 就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四 ...
- 区间DP 学习笔记
前言:本人是个DP蒟蒻,一直以来都特别害怕DP,终于鼓起勇气做了几道DP题,发现也没想象中的那么难?(又要被DP大神吊打了呜呜呜. ----------------------- 首先,区间DP是什么 ...
随机推荐
- HDU 1432 Lining Up(几何)
http://acm.hdu.edu.cn/showproblem.php?pid=1432 题目大意: 2维平面上给定n个点,求一条直线能够穿过点数最多是多少. 解题思路: 因为题目给定的n(1~7 ...
- 009-hostname与/etc/hosts区别
- Jackson基础
一.所需jar包: jackson-core-x.x.x-rc4.jar.jackson-databind-x.x.x-rc4.jar.jackson-annotations-x.x.x-rc4.ja ...
- Linux服务器配置---ftp限制带宽
限制带宽 ftp服务器可以设置每个用户的带宽,这样根据实际需求来分配,更加充分的利用系统资源.带宽通过参数“anon_max_rate“和”local_max_rate“来设置,这两个参数在配置文件中 ...
- 什么是公网IP、内网IP和NAT转换?
搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么? 1.引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地 ...
- OpenCV-跟我一起学数字图像处理之拉普拉斯算子
https://www.cnblogs.com/german-iris/p/4840647.html Laplace算子和Sobel算子一样,属于空间锐化滤波操作.起本质与前面的Spatial Fil ...
- bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond
P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽 ...
- Linux 系统版本查询
显示Linux版本信息 输入"cat /proc/version",说明正在运行的内核版本. 输入"cat /etc/issue", 显示的是发行版本信息. 输 ...
- JavaScript 添加新元素
JavaScript 添加新元素 版权声明:未经授权,严禁转载! 添加元素 创建元素 使用 JS 可以为一个已有的元素添加一个新的子元素. 第一步:创建空元素. - var elem = docume ...
- troubleshooting-Container 'PHYSICAL' memory limit
原因分析 CDH 集群环境没有对 Container分配足够的运行环境(内存) 解决办法 需要修改的配置文件,将具体的配置项修改匹配集群环境资源.如下: 配置文件 配置设置 解释 计算值(参考) ya ...