OVSolitario-io

导航

区间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区间划分,枚举长度的起点,终点,并在这个范围内划分分界点

posted on 2025-10-09 21:10  TBeauty  阅读(3)  评论(0)    收藏  举报