这段时间学习了区间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. JSP中实现网页访问统计的方法【转】

    我采用的是jsp网页,但是不管采用什么语言,原理是一样的. 第一种,单页面统计.就是说,只要点击这个页面就会统计一次. <body> <%!//在这种标记中定义的变量为全局变量 in ...

  2. nodejs的jsonrpc调用

    记录下使用nodejs发送jsonrpc请求: var express = require('express'); var router = express.Router(); var request ...

  3. redis操作基本命令

    Redis—— Remote Dictionary Server,它是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,我们 ...

  4. 一:SpringDataJPA

    一:spring data jpa介绍 spring data:其实spring data就是spring提供了一个操作数据的框架.而spirng data jpa只是spring data框架下的一 ...

  5. TCP基础知识(一)简介与数据包

    TCP详解(1):简介与数据包 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议 应用层向TCP层发送用于网间传输 ...

  6. express实现todolist

    app.js var express = require('express'); var todoController = require('./controllers/todoController. ...

  7. express组件学习

    一.express 可以做:web application.api... 特性: 适合写简单的路由系统 集成很多模板引擎 中间件系统 二.请求与响应 var express = require('ex ...

  8. 01.php面向对象

    下面是php_oop的一些基本知识 <?php //echo "<meta charset='utf-8'>" //设置中文输出 //1.面向对象类的建立: cl ...

  9. js实现数组内数据的上移和下移

    var swapItems = function(arr, index1, index2){ arr[index1] = arr.splice(index2,1,arr[index1])[0] ret ...

  10. 移动端Hybird的网络层优化策略

    一.前端代码策略:域名切换(多域名部署),解决DNS缓存及域名劫持 二.客户端策略 客户端在空闲时ping cdn节点域名列表中的域名,测量延时.丢包等数据.如果延迟 > xxx,丢包 > ...