AtCoder dp_n. Slimes 题解 区间DP(四边形不等式优化)

题目链接:https://atcoder.jp/contests/dp/tasks/dp_n

其实就是 石子合并~

示例程序:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int maxn = 505;

int n, a[maxn], s[maxn][maxn];
ll f[maxn][maxn], sum[maxn];

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", a+i);
        sum[i] = sum[i-1] + a[i];
    }
    for (int l = 2; l <= n; l++) {
        for (int i = 1; i+l-1 <= n; i++) {
            int j = i+l-1;
            if (l == 2) {
                f[i][j] = sum[j] - sum[i-1];
                s[i][j] = i;
            }
            else {
                f[i][j] = 1e18;
                for (int k = s[i][j-1]; k <= s[i+1][j]; k++) {
                    ll tmp = f[i][k] + f[k+1][j] + sum[j] - sum[i-1];
                    if (tmp < f[i][j]) {
                        f[i][j] = tmp;
                        s[i][j] = k;
                    }
                }
            }
        }
    }
    printf("%lld\n", f[1][n]);
    return 0;
}
posted @ 2026-09-13 16:15  quanjun  阅读(6)  评论(0)    收藏  举报