关于本题解法
查看原帖
关于本题解法
620253
MvemiY楼主2024/8/12 20:46

斜率优化板子,满足决策单调性。我尝试用分治实现决策单调性复杂度 O(knlogn)O(knlogn),但是不知道为什么 WA 了,是不能用分治还是我代码有问题?

谢谢各位大佬 QWQ

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3010;
typedef long long ll;

ll n, a[MAXN], s[MAXN], f[MAXN][MAXN], k;

void solve(int l1, int r1, int l2, int r2, int kp){
//	cout << l1 << ' ' << r1 << ' ' << l2 << ' ' << r2 << ' ' << kp << endl;
	if(l2 > r2 || l1 > r1) return ;
	int mid = (l2+r2) >> 1, pos = l1;
	for(int i = l1; i < mid && i < r1; i++){
		if(f[mid][kp] > f[i][kp-1] + (s[mid]-s[i])*(s[mid]-s[i])){
			f[mid][kp] = f[i][kp-1] + (s[mid]-s[i])*(s[mid]-s[i]);
			pos = i;
		}
	}
//	cout << mid << ' ' << pos << endl;
	solve(l1, pos, l2, mid-1, kp);
	solve(pos, r1, mid+1, r2, kp); 
}

int main(){
	ios :: sync_with_stdio();
	cin.tie(); cout.tie();
	cin >> n >> k;
	for(int i=  1; i <= n; i++)
		for(int j = 1; j <= k; j++)
			f[i][j] = 0x3f3f3f3f3f3f3f3f;
	for(int i = 1; i <= n; i++)
		cin >> a[i], s[i] = s[i-1] + a[i];
	for(int i = 1; i <= n; i++)
		f[i][1] = s[i]*s[i];
	for(int kp = 2; kp <= k; kp++)
		solve(1, n, 1, n, kp);
	cout << f[n][k] * k - s[n] * s[n];
	return 0;
}
2024/8/12 20:46
加载中...