第 8 个点是什么 $\ast\ast$ 玩意
查看原帖
第 8 个点是什么 $\ast\ast$ 玩意
448887
cancan123456楼主2022/9/16 16:05

一直 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;
}
2022/9/16 16:05
加载中...