文章

4

粉丝

8

获赞

13

访问

822

头像
石子合并(区间DP模板题)
P5288 南京大学机试题
发布于2025年3月21日 16:02
阅读数 133


解题思路

由于每次只能合并相邻的两堆石子,因此事实上,我们每次合并总是合并连续的两段。设f(l, r)表示使得l - r号石子堆合并为一堆的最小代价,我们可以枚举分界点k,即看作是将l - k和(k + 1) - r号两堆石子合并,且其代价是l到r号石子堆的重量之和(此处用前缀和优化),因此状态转移方程为f(l, r) = max[l <= k < r](f(l, k) + f(k + 1, r)) + ∑[l <= i <= r](wi)。
 


C++代码

#include <iostream>
#include <array>
#include <algorithm>

#define MAXN 512
#define INF 0x7fffffff

std::array<int, MAXN> sum;
std::array<std::array<int, MAXN>, MAXN> f;

int main() {
    int n;
    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        std::cin >> sum[i];
        sum[i] += sum[i - 1];
    }
    
    for (int len = 2; len <= n; len++) {
        for (int l = 1; l + len - 1 <= n; l++) {
            int r = l + len - 1;
            f[l][r] = INF; 
            for (int k = l; k < r; k++) {
                f[l][r] = std::min(f[l][r], f[l][k] + f[k + 1][r] + sum[r] - sum[l - 1]);
            }
        }
    }
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发