区间型dp:一般是给定一个字符串或者序列,对其进行一些操作,最后一步将它去头或者去尾,剩下会是一个区间 [ i , j ],状态定义就是f[i][j],表示子序列[i,j]具有的最优性质。
问题一:给定一个字符串序列,找出其最长的子回文串序列的长度。
例:
输入:S = ['b','b','b','a','b']
输出:4(['b','b','b','b'])
问题分析:最优策略的子序列是T,长度时M
case 1: M = 1,即T是一个字符的子序列
case 2: M > 1,则必有T[0] = T[M-1]
设;T[0] = S[i],T[M-1] = S[j],则去掉T[0]和T[M-1]的T[1,...,M-2]必然是序列S[i+1,...,j-1]的最长子序列回文串。
子问题:要求S[i...,j]的最长回文子串
如果S[i] = S[j],则需要知道S[i+1,...,j-1]的最长回文子串
如果S[i] != S[j],则答案是S[i+1,...,j]或者S[i,...,j-1]的最长回文子串。
转移方程:
设:f[i][j]是序列S[i,...,j]的最长回文子串的长度
f[i][j] = max{f[i+1][j] , f[i][j-1] ,f[i+1][j-1] + 2 | s[i]=s[j]}
初始条件:
一个字符也是一个回文串
f[0][0],...,f[N-1][N-1] = 1
如果S[i] = S[i+1],则f[i][i+1] = 2
如果S[i] != S[i+1],则f[i][i+1] = 1
计算顺序:
不能按照之前的f[0...N]...f[N...N]的计算顺序,区间型dp应该按照长度j-i从小到大计算
长度1:f[0][0],f[1][1],......,f[N-1][N-1]
长度2:f[0][1],f[1][2],...,f[N-1][N-1]
.
.