BZOJ 3675 APIO2014 序列切割 斜率优化DP
2017-06-26 18:56
405 查看
题意:链接
方法:斜率优化DP
解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了。就是过不了BZ。
看到这道题自己第一发DP是这么推得:
设f[i][j]是第j次分第i个的最大得分。
那么会推出来f[i][j]=max(f[k][j−1]+sum[i k]∗sum[1 k−1]或(sum[k i]∗sum[i+1 n]))然后我发现这个式子的复杂度非常高暂且不说。就光那个或的讨论就非常费劲。
于是想了想就放弃了这个念头。中规中矩的去想。
依照以往的思路设出状态f[i][j]代表前i个分j次的最大得分。
能推出转移方程
f[i][j]=max(f[k][j−1]+sum[k]∗(sum[j]−sum[k]))
之后对于例子手写一遍看出它的正确性后进行后面的讨论
我们发现假设n^2的枚举是肯定不行的。所以才去一种方式进行维护,由于有k的元素的存在,所以从斜率角度入手。
详细推导过程就不写了,得出的结果是:
f[j][tmp异或1]−f[k][tmp异或1]+sum[k]2−sum[j]2sum[k]−sum[j]<=sum[i]
则说明k比j优。
所以尾部就是维护g[j,k]
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 100010 #define K 210 using namespace std; typedef unsigned long long ll; ll sum ,a ,f [2],q ; ll n,k; int tmp; ll fy(int j1,int j2,int d) { return f[j1][d]-f[j2][d]+sum[j2]*sum[j2]-sum[j1]*sum[j1]; } ll fx(int j1,int j2) { return sum[j2]-sum[j1]; } int main() { scanf("%llu%llu",&n,&k); for(int i=1;i<=n;i++) { scanf("%llu",&a[i]); sum[i]=sum[i-1]+a[i]; } tmp=0; for(int j=1;j<=k;j++) { tmp^=1; int head=0,tail=0; q[head]=0; for(int i=1;i<=n;i++) { while(head<tail&&fy(q[head],q[head+1],tmp^1)<=fx(q[head],q[head+1])*sum[i])head++; while(head<tail&&fy(q[tail-1],q[tail],tmp^1)*fx(q[tail],i)>=fy(q[tail],i,tmp^1)*fx(q[tail-1],q[tail]))tail--; int t=q[head]; f[i][tmp]=f[t][tmp^1]+sum[t]*(sum[i]-sum[t]); q[++tail]=i; } } printf("%llu\n",f [tmp]); }
相关文章推荐
- 【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]
- [BZOJ 3675][Apio2014]序列分割:DP斜率优化
- [BZOJ 3675][APIO 2014]序列分割(斜率优化DP)
- bzoj-3675 序列分割APIO2014 斜率优化dp
- [BZOJ3675][Apio2014]序列分割(斜率优化dp)
- 【bzoj3675】[Apio2014]序列分割 斜率优化dp
- 【BZOJ3675】序列分割(APIO2014)-DP斜率优化
- [省选前题目整理][BZOJ 3675][APIO 2014]序列分割(斜率优化DP)
- [BZOJ3675][Apio2014]序列分割(斜率优化dp)
- bzoj3675[Apio2014]序列分割 斜率优化dp
- bzoj 3675: [Apio2014]序列分割【斜率优化dp】
- BZOJ 3675 APIO2014 序列分割 斜率优化DP
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
- bzoj3675: [Apio2014]序列分割【斜率优化dp】
- bzoj 3675: [Apio2014]序列分割 斜率优化dp
- [BZOJ3675][Apio2014]序列分割(斜率优化DP)
- 【BZOJ3675】【APIO2014】序列分割(斜率优化DP)
- BZOJ3675 [Apio2014]序列分割 【斜率优化dp】
- BZOJ 3675 [Apio2014] 序列分割 斜率优化
- 【斜率DP】BZOJ 3675:[Apio2014]序列分割