做了几题区间动态规划的题目,觉得区间动态规划的题目是有点难的。区间DP大概是这一类的动态规划,在一个线性的数据上对区间进行状态转移,dp[i][j]表示i到j的区间。dp[i][j]可以由子区间的状态转移而来,关键是dp[i][j]表示的是什么,然后去找dp[i][j]和子区间的关系。要知道,在求dp[i][j]之前,i到j之间的子区间都已经求出来最优解。
一点一点说吧!
首先我觉得首先区间DP的应用要先想到回文串的,包括一个字符串的最长的非连续的回文串,一个字符串非连续的回文串的数目。因为回文串的特点对应的两端字符是相等的,所以状态是可以转移的,先看一道求一个字符串中回文串的数目:
HDU 4632
接下来就是求回文串的最长的长度问题
HDU 4745
这道题目是在求区间最长的回文串长度升级一下,序列是一条链。这里可以用倍增的方法。状态转移方程:
dp[i][j]= max ( dp[i+1][j], max ( dp[i][j-1],
( a[i]==a[j] ? dp[i+1][j-1] + 2 : dp[i+1][j-1] ) ) );就是在dp[i+1][j],dp[i][j-1],dp[i+1][j-1]三个子区间求最大值。
这道题和前面的比较,求最长的长度是在dp[i+1][j],dp[i][j-1],dp[i+1][j-1]三个子区间里进行比较,而求数量,则是把求子区间的和。这两道的题目的子区间只涉及到dp[i+1][j],dp[i][j-1],dp[i+1][j-1],并没有在i到j之间进行区间划分,这是因为回文串的特性。
下面看划分区间的区间DP问题:
题目链接:
http://poj.org/problem?id=2955
这是一道简单的区间划分dp题目
求最长的匹配括号的长度,划分区间是没有条件的,从i到j区间内任何一点都可以划分,dp[i][j]=max(dp[i][k]+dp[k+1][j]){k=i….j}
题目链接:
http://poj.org/problem?id=1651
题目链接:
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1422
状态转移方程是要在i到j区间之间进行区间划分。你可以从左端点开始,也可以从右端点开始。只有当k等于左端点或者右端点的时候才可以划分。因为这样的话,第k天就不用穿新衣服,少买了一件,这也是得到最优解的关键,
再看这道题目的升级版:
http://acm.hdu.edu.cn/showproblem.php?pid=2476
在前面的基础上,再进行一次区间DP
再看一道难度增加的区间划分,
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=4283
这道题目在划分区间之后,要计算因为状态改变,而改变的不满意值
有时候区间DP的状态要根据题目有不同的形式,不仅是二维数组表示区间,也可以加其他维,表示不同的状态。
这道题目用来四维数组,另外两维表示左边和右边的颜色种类
题目链接:
http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3469
三维数组,第三维表示快递小哥在区间的哪一边?
最优三角划分:
http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3537
这个题目要先用凸包算法判断凸包,然后再进行区间划分,进行DP