这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需。

学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如背包问题中,每一个点存储的状态中,拿到的物品的编号并不要求一定连续)而区间DP,则是要求DP数组中每个点的状态映射到原本的数据集中都会与附近的元素有所关联,其中,连续区间的长度、起始点的位置、子区间分割点的位置都会有所变化,而这和一般的DP有所不同,故一般用区间DP。

区间DP的一般格式(参考博客)

for(int l=;l<=n;l++)   //每次处理的区间的长度
for(int i=;i+l-<len;i++) //每次区间的起点
int j=i+l-; //每次区间的终点
for(int k=i;k<j;k++) //区间的分割点
//TODO:状态转移方程

两个个例题:

一.POJ1561

AC代码:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int maxn=; int dp[maxn][maxn];
int num[maxn]; int main(){
int n;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&num[i]);
} for(int l=;l<n;l++){
for(int i=;i+l<=n+;i++){
dp[i][i+l-]=;
for(int k=i;k<i+l-;k++){
dp[i][i+l-]=min(dp[i][i+l-],dp[i][k]+dp[k+][i+l-]+num[i-]*num[k]*num[i+l-]);
}
}
}
printf("%d\n",dp[][n]);
return ;
}

二.POJ2955

AC代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn=; char str[maxn];
int dp[maxn][maxn]; int check(char a,char b){
if(a=='('&&b==')'){
return ;
}
if(a=='['&&b==']'){
return ;
}else{
return ;
}
} int main(){
while(scanf("%s",str)!=EOF){
if(str[]=='e')break;
int len=strlen(str);
memset(dp,,sizeof(dp)); for(int i=;i<len;i++){
dp[i][i]=;
if(check(str[i],str[i+]))dp[i][i+]=;
else dp[i][i+]=;
} for(int l=;l<=len;l++){//区间的长度
for(int i=;i+l-<len;i++){//开始的位置
int j=i+l-;
if(check(str[i],str[j]))dp[i][j]=dp[i+][j-]+;
for(int k=i;k<j;k++){ //区间的分割
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]);
}
}
}
printf("%d\n",dp[][len-]); }
return ;
}

区间DP学习总结的更多相关文章

  1. 区间dp学习笔记

    怎么办,膜你赛要挂惨了,下午我还在学区间\(dp\)! 不管怎么样,计划不能打乱\(4\)不\(4\).. 区间dp 模板 为啥我一开始就先弄模板呢?因为这东西看模板就能看懂... for(int i ...

  2. 区间DP 学习笔记

    前言:本人是个DP蒟蒻,一直以来都特别害怕DP,终于鼓起勇气做了几道DP题,发现也没想象中的那么难?(又要被DP大神吊打了呜呜呜. ----------------------- 首先,区间DP是什么 ...

  3. [学习笔记]区间dp

    区间 \(dp\) 1.[HAOI2008]玩具取名 \(f[l][r][W/I/N/G]\) 表示区间 \([l,r]\) 中能否压缩成 \(W/I/N/G\) \(Code\ Below:\) # ...

  4. 区间DP的学习(持续更新)

    例题: 1.Multiplication Puzzle 原题地址:http://poj.org/problem?id=1651 2.Dire Wolf 原题地址:http://acm.split.hd ...

  5. ACM学习历程—HDU1584 蜘蛛牌(动态规划 && 状态压缩 || 区间DP)

    Description 蜘蛛牌是windows xp操作系统自带的一款纸牌游戏,游戏规则是这样的:只能将牌拖到比她大一的牌上面(A最小,K最大),如果拖动的牌上有按顺序排好的牌时,那么这些牌也跟着一起 ...

  6. 数塔~~dp学习_1

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Mem ...

  7. HDU3480_区间DP平行四边形优化

    HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前  i  个节点被分为  j  个区间所取得的最优值的情况 cost[i][j]表示从i ...

  8. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  9. 斜率优化DP学习笔记

    先摆上学习的文章: orzzz:斜率优化dp学习 Accept:斜率优化DP 感谢dalao们的讲解,还是十分清晰的 斜率优化$DP$的本质是,通过转移的一些性质,避免枚举地得到最优转移 经典题:HD ...

随机推荐

  1. Python对列表中字典元素排序

    问题起源 json对象a,b a = '{"ROAD": [{"id": 123}, {"name": "no1"}]} ...

  2. Nginx几个简单命令

    • 启动nginx服务 sudo brew services start nginx 利用http://localhost:8080进行访问, 如果出现如下界面,说明启动成功. • 查看nginx版本 ...

  3. win10中VirtualBox联网设置

    <分享>关于win10操作系统中VirtualBox无法桥接的解决方法 版权声明:本文为博主原创文章,未经博主允许不得转载. 升级win10,本来是一件很好的事,想好好体验一下新版本的感觉 ...

  4. linux系统修改route路由

    linux下静态路由修改命令方法一:添加路由route add -net 192.168.0.0/24 gw 192.168.0.1route add -host 192.168.1.1 dev 19 ...

  5. JS 操作 HTML 和 AJAX 请求后台数据

    为某个元素插入值,添加属性,添加子元素 <div class="col-sm-6"> <select class="form-control" ...

  6. C#基础 (一)

    值类型和引用类型 堆和栈 栈存放的数据: (1)某些类型变量的值(2)程序当前的执行环境(3)传递给方法的参数 堆是存放对象的地方 对象类型有两种: 值类型和引用类型,他们的存储方式不同值类型: 只需 ...

  7. ApplicationHost.config文件被破坏导致IIS崩溃

    “”Application Host Helper Service 在尝试删除历史目录“C:\inetpub\history\CFGHISTORY_0000000475”时遇到错误.将跳过并忽略此目录 ...

  8. 打印thinkphp中的sql语句

    var_dump($repair->fetchSql(true)->where(array('cuername' =>$cuername))->order('applytime ...

  9. String Control

    using System; using System.Collections.Generic; using System.Text; using System.Web; using System.We ...

  10. 记录开发Nodejs c++ addon的一些经验(二、数据类型的转换(尤其是Buffer))

    常见的数据类型的转换基本比较容易,结合nan应该不是一件难事 参考链接: http://blog.jobbole.com/109598/ http://deadhorse.me/nodejs/2012 ...