斜率优化板子,满足决策单调性。我尝试用分治实现决策单调性复杂度 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;
}