时空双修小代码
2025-09-07 18:02:03
发布于:广东
7阅读
0回复
0点赞
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 405
#define INF 0x3f3f3f3f
using namespace std;
int n, m;
int a[MAX], f[MAX][MAX], s[MAX];
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
s[i] = s[i-1] + a[i];
}
m++;
memset(f, 0x3f, sizeof(f));
f[0][0] = 0;
for (int i = 1; i <= n; ++i) {
int max_j = min(m, i);
for (int j = 1; j <= max_j; ++j) {
int mx = a[i];
int min_k = max(0, j-1 - 1);
for (int k = i-1; k >= min_k; --k) {
f[i][j] = min(f[i][j], f[k][j-1] + mx * (i - k) - (s[i] - s[k]));
mx = max(mx, a[k]);
}
}
}
int ans = INF;
for (int j = 1; j <= m; ++j) {
ans = min(ans, f[n][j]);
}
printf("%d", ans);
return 0;
}
这里空空如也
有帮助,赞一个