一直 90,代码:
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 3005;
int n, a[N], sum[N], num[N];
ll dp[N];
void DP(int k) {
dp[0] = num[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = num[i] = 0x7fffffff;
for (int j = 0; j < i; j++) {
ll new_value = dp[j] + (sum[i] - sum[j]) * (sum[i] - sum[j]) + k;
if (dp[i] > new_value || (dp[i] == new_value && num[i] > num[j] + 1)) {
dp[i] = new_value;
num[i] = num[j] + 1;
}
}
}
}
int main() {
int m;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
sum[i] = sum[i - 1] + a[i];
}
int l = 0, r = sum[n] * sum[n];
ll ans = -1;
while (l <= r) {
int mid = (l + r) / 2;
DP(mid);
if (num[n] > m) {
l = mid + 1;
} else {
ans = dp[n] - num[n] * mid;
r = mid - 1;
}
}
printf("%lld", ans * m - sum[n] * sum[n]);
return 0;
}