区间DP是一类在区间上进行动态规划的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维。然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两个区间合并到整个区间,或者说局部最优解合并为全局最优解,然后得解。

这类DP可以用常规的for循环来写,也可以用记忆化搜索来写,个人更倾向于记忆化搜索写法,因为这种写法相当易懂,要什么值你直接去记忆化搜索一下就ok了,随叫随到随用啊。

1、Zoj 3537 Cake

比较经典的三角剖分。

状态转移方程:dp[i][j] = min(dp[i][k]+dp[k][j]+cost[i][k]+cost[k][j]),(j >= i+ 3,i+1<=k<=j-1,cost[i][k]为连一条i到k的线的费用)

详细报告见Here

2、Light oj 1422 Halloween Costumes

很基础的区间DP,是不老传说那题的减弱版。

状态转移方程:dp[i][j] = dp[i][j-1] (arr[i] == arr[j])

dp[i][j] = min(dp[i][k]+dp[k+1][j]) (arr[i] == arr[k] && i <= k <= j)

3、poj 2955 Brackets

经典的区间DP模型--最大括号匹配数。如果找到一对匹配的括号[xxx]oooo,就把区间分成两部分,一部分是xxx,一部分是ooo,然后以此递归直到区间长度为1或者为2.

状态转移方程:dp[i][j] = min(dp[i+1][j],dp[i+1][k-1]+dp[k+1][j]+1)(i<=k<=j&&i和k是一对括号)

4、CF 149 D Coloring Brackets

限制很多的括号匹配类区间DP,因为给定的是一个合法序列,那么左括号对应着右括号的位置就定下来了,那么[i,j]区间就分成了[i+1,match[i]-1]和[match[i]+1,j],再记录下某个区间左右两边的颜色就好了。

5、1651 Multiplication Puzzle

经典的区间DP模型--矩阵链乘的变换。我们从一开始一步步往后删很困难进行DP,那么从最后只剩两个也就是最左和最右时开始一步步增加就成功转换为经典的矩阵链乘了。一开始的区间是[i,j],那么我们可以选择i<k<j进行转移,就是用这个k将区间划分成两段,然后这两段再往下递归,最后返回信息,最后的最后返回的[i,j]的最少乘积和。

状态转移:dp[i][j] = min(dp[i][k]+dp[k][j]+arr[i]*arr[k]*arr[j]);

6、Zoj 3469 Food Delivery

有n个人叫餐,每个人都在x轴上,并且每个人都有个坑爹度(和等餐时间有关,据说顾客认为坑爹值到一定程度他的小宇宙就要爆发).现在送餐员从x轴上的某点出发,路上奔跑速度是v,要一次性把所有餐送完。叫餐的人得到餐的时间和顺序不同,坑爹度总和也就不同。合格的送餐员要让客户体验最好,请问最少坑爹度和为多少。先YY出一个结论,最优的送餐顺序肯定是餐馆往两边来回跑,然后就可以进行状态转移了.

详细报告见Here.

7、Hdu 4283 You Are the One  (较难)

题意是给定一个序列,序列内的人有屌丝值Di,是第然后将这个序列进栈,第i个人如果是第k个出栈,那么最后的屌丝总值增加Di * (k-1), 求一个出栈序列使得总屌丝值最小。看这题目很难想到区间DP吧?是的,很不像,这样的题目是好题目。其实一个合法的出栈序列有一个性质:如果第i个人第k个出栈,那么在i个之后的人不可能会比i更早,这样就找到一个划分关系,k以前位一段,k以后为一段。常规的状态转移方程:dp[i][j] = min(dp[i+1][k]+dp[k+1][j]+arr[i]*(k-i)+(k-i+1)*(sum[j]-sum[i])) (i<=k<=j).详细报告见Here.

8、Sdut 不老的传说问题 (较难)

刚看到题目的时候一点想法都没有,关于颜色的状态怎么表示,莫非要开一维来表示颜色,可是这样转移就很怪异了,或者倒着推,看刷几下全变成0,这似乎也不行。一筹莫展额时候突然想到根本不需要表示颜色,只需要表示某个位置是不是刷到了相应的颜色即可.5 4 3 1 2 1 2 1 3 4 5,假设5 4 3和3 4 5都刷到位了,那么1 2 1 2 1这四个位置上可能已经有其他颜色,但在我们看来它和无色一样,因为它不是最终的颜色。单独考虑1 2 1 2 1,这要怎么刷呢,由于最后的那个1和一开始那个1一样,如果他们之间距离小等于k,那么我们就可以只计算1 2 1 2。如果距离大于k,那么我们可以把这段区间分成1,2 1 2 1,或者1 2 1 , 2 1这两种方案中刷得次数较小的就是1 2 1 2 1需要刷得次数.以此递归下去,便可得解。因为本题是个圈,所以需要用到一个技巧,那就是把1.2...n-1复制到n+1,...2 * n - 1,然后最终的答案就是min(dp[i][i+n-1])(1<=i<=n)

状态转移方程:dp[i][j] = dp[i][j-1] ; (i + k - 1 >=j && arr[j] == arr[i])

dp[i][j] = min(dp[i][k]+dp[k+1][j]) (1<=k<=min(i+k-1,j) && arr[i] == arr[k])

初始化dp[i][i] = 1,dp[i][j] = INF (j > i)

9、Hdu String painter

2008年长春区域赛的题目,和上一题很像,但觉得比上一题简单。由于每次可以选择将某段刷成某个字符a,然后下次刷得时候,假设刷b,可以把这段刷成不一样的两段,前一段时b,后一段是a。大概的刷法就是这样,这个b其实是s2[i]。

状态转移方程很容易想到:dp[i][j][pre] = min(dp[i+1][k][s2[i]] + dp[k+1][pre]) (pre == s2[i] && i <= k <= j)

dp[i][j][pre] = min(dp[i+1][k][s2[i]] + dp[k+1][pre] + 1) (pre != s2[i] && i <= k <= j)

这类DP的写法一般是固定,两种写法可以参照下这篇文章里的代码:http://blog.csdn.net/woshi250hua/article/details/7973824

本文ZeroClock原创,但可以转载,因为我们是兄弟。

【DP_区间DP专辑】相关推荐

  1. BZOJ4350: 括号序列再战猪猪侠【区间DP】

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...

  2. POJ 2955 Brackets (区间DP)

    题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  3. 0x53. 动态规划 - 区间DP(习题详解 × 8)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...

  4. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

  5. UVA10003 切木棍 Cutting Sticks(区间DP、细节)

    整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...

  6. 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)

    最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...

  7. 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★

    P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...

  8. poj1651(区间dp)

    题目连接:http://poj.org/problem?id=1651 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积.直到只剩下首尾两个数 ...

  9. HDU 5115 Dire Wolf ——(区间DP)

    比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...

最新文章

  1. cocos2dx 字体外发光_Ps教程:只需4个图层!即可制作出超炫酷的荧光字体
  2. 多线程必须用到的线程池(什么时候用多线程)
  3. 微软亚研院:如何看待计算机视觉未来的走向?
  4. druid连接池_SpringBoot整合JDBCTemplate及Druid连接池
  5. 编写第一个Linux环境下程序的编译,下载记录
  6. Redis解决秒杀中的超卖问题
  7. 算法概论第八章课后习题8.3
  8. Numpy_where
  9. c语言+Easy X图形库实现飞机大战,源码加素材
  10. Android LayoutInflater源码分析
  11. php语音机器人,php运营版语音机器人接单源代码带完美教程
  12. 处理样本分布不平衡,偏斜比较厉害的方法总结
  13. C# 代码 Unicode码和字符串相互转换
  14. Android源码目录结构详解(转载)
  15. 树莓派官方系统(raspbian)安装及使用教程
  16. 软考程序员有必要考吗?
  17. 计算机与了解Dos指令
  18. 人脸识别尝试失败欧氏距离
  19. web渗透_一句话木马(webshell)_dvwa环境
  20. SpringMVC和SSM整合步骤(最详细)

热门文章

  1. Element_Table的单元格合并
  2. SQL全方位攻略:之数据库历史、数据库基本概念和相关术语,以及常见的数据库类型介绍
  3. 长度短点的uuid_如何压缩UUID长度?
  4. @slf4j日志格式配置
  5. 多边形颜色填充-X扫描线算法
  6. 小程序swiper切换闪屏问题
  7. 【实习日志】SSM用户管理系统搭建+更新
  8. 【Linux】syscall系统调用原理及实现
  9. bp神经网络实验报告郑航_bp神经网络实验报告
  10. latex+bibtex+jabref