区间DP:考虑区间的划分
区间DP:状态表示为某区间,dp[i,j]表[i,j]区间
对于区间DP,要找到顺序使得依赖已经计算
石子合并:石子合并(弱化版)
每次操作一定是将相邻两堆合并,那么考虑all的分界情况考虑将哪两堆合并(即左边右边合并)
定义:dp[i,j]表示合并方法,all将第i堆到第j堆合并为1堆的合并方式
状态转移方程:左边min + 右边min + 左右合并代价
这里的顺序即枚举区间长度(小->大),这里按区间长度枚举
点击查看代码
for (int i = 1; i <= n; ++ i) s[i] += s[i - 1];//前缀和处理区间代价
for (int len = 2; len <= n; ++ len)//从2开始(只有自己不合并)
for (int i = 1; i + len - 1 <= n; ++ i)//len = r - l + 1,则MAXr = l + len - 1
{
int l = i, r = i + len - 1;
f[l][r] = INF;
for (int k = l; k < r; ++ k) {//分界点右边至少为1,即r-1
f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
}
}
printf("%d\n", f[1][n]);
这里考虑以区间长度作为dp区间划分,枚举长度的起点,终点,并在这个范围内划分分界点
浙公网安备 33010602011771号