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;
}
浙公网安备 33010602011771号