区间 DP
什么是区间 DP?¶
区间类动态规划是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。令状态
区间 DP 的特点:
合并:即将两个或多个部分进行整合,当然也可以反过来;
特征:能将问题分解为能两两合并的形式;
求解:对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值。
例题 「NOI1995」石子合并
题目大意:在一个环上有
考虑不在环上,而在一条链上的情况。
令
写出 状态转移方程:
令
怎样进行状态转移¶
由于计算
怎样处理环¶
题目中石子围成一个环,而不是一条链,怎么办呢?
方法一:由于石子围成一个环,我们可以枚举分开的位置,将这个环转化成一个链,由于要枚举
方法二:我们将这条链延长两倍,变成
核心代码¶
1 2 3 4 5 6 7 | // C++ Version
for (len = 1; len <= n; len++)
for (i = 1; i <= 2 * n - 1; i++) {
int j = len + i - 1;
for (k = i; k < j && k <= 2 * n - 1; k++)
f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + sum[j] - sum[i - 1]);
}
|
1 2 3 4 5 6 7 | # Python Version
for len in range(1, n + 1):
for i in range(1, 2 * n):
j = len + i - 1
while k < j and k <= 2 * n - 1:
f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + sum[j] - sum[i - 1])
k += 1
|
几道练习题¶
build本页面最近更新:,更新历史
edit发现错误?想一起完善? 在 GitHub 上编辑此页!
people本页面贡献者:OI-wiki
copyright本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用