一般来说区间DP,不是将(i,j)从小到大遍历;
而是按区间长度进行枚举
枚举代码模板:
for(int L = 2;L <= n; L++)
{
for(int i=1;i+L-1 < n;i++)
{
int j = i+L-1;
填写状态表达式,求符合题意的值
}
}
-
最大回文子串
f[i][j]:表示区间[i,j]之间的字串是否是回文串按字串的长度进行枚举:
for(int L = 3;L <= n; L++)
{
for(int i=1; i+L-1 < n; i++)
{
int j = i+L-1;
if(a[i] == b[j]) f[i][j] = f[i+1][j-1];
else f[i][j] = 0;
}
}
- 堆石子
f[i][j]:表示区间[i,j]合并所需要的最小代价
枚举代码:
for(int L=2;L<=n;L++)
{
for(int i=1;i+L-1<=n;i++)
{
int j = i+L-1;
f[i][j] = 1e8;
for(int k=i;k<=j;k++)
{
f[i][j] = min(f[i][j] , f[i][k]+f[k+1][j]+i到j所有物品的质量(可以用前缀和求));
}
}
}