传送门

没想到这种多个状态转移的还能用上斜率优化……学到了……

首先我们可以发现,切的顺序对最终答案是没有影响的

比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得分是$ab+bc+ac$,而如果先切$bc$再切$ab$,得分也是$ab+bc+ac$,不难看出得分是一样的

那么我们可以考虑一下转移方程$$dp[a][i]=max\{dp[a-1][j]+sum[j]*(sum[i]-sum[j])\}$$

其中$a$表示切几刀,$sum$表示前缀和

然后发现空间复杂度太大了,又发现每一刀的状态只与前一刀有关,那么可以用滚动数组优化

然后上面的转移是$O(n^2k)$的,那么考虑用斜率优化优化到$O(nk)$(以下省略dp的第一维)

我们假设$j>k$且$j$比$k$更优,则有$$dp[j]+sum[j]*(sum[i]-sum[j])>dp[k]+sum[k]*(sum[i]-sum[k])$$

$$(dp[j]-sum[j]^2)-(dp[k]-sum[k]^2)>sum[i]*sum[k]-sum[i]*sum[j]$$

因为$sum[k]-sum[j]$是负数,所以除的时候不等式要变号

$$\frac{(dp[j]-sum[j]^2)-(dp[k]-sum[k]^2)}{sum[k]-sum[j]}<sum[i]$$

然后直接上斜率优化

注意特判$sum[k]-sum[j]=0$,随便返回极大值或极小值

顺便注意记录路径

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #define ll long long
 5 using namespace std;
 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1=buf,*p2=buf;
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 char sr[1<<21],z[20];int C=-1,Z;
19 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
20 inline void print(int x){
21     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
22     while(z[++Z]=x%10+48,x/=10);
23     while(sr[++C]=z[Z],--Z);sr[++C]=' ';
24 }
25 const int N=100005;
26 int to[205][N],q[N],n,k,h,t,r;
27 ll sum[N],dp[2][N];
28 inline double slope(int j,int k){
29     if(sum[j]==sum[k]) return 1e18;
30     return ((dp[r^1][j]-sum[j]*sum[j])-(dp[r^1][k]-sum[k]*sum[k]))*1.0/(sum[k]-sum[j]);
31 }
32 int main(){
33     //freopen("testdata.in","r",stdin);
34     n=read(),k=read();
35     for(int i=1;i<=n;++i) sum[i]=read()+sum[i-1];
36     for(int a=1;a<=k;++a){
37         r=a&1;
38         h=t=0;
39         for(int i=1;i<=n;++i){
40             while(h<t&&slope(q[h],q[h+1])<sum[i]) ++h;
41             to[a][i]=q[h];
42             dp[r][i]=dp[r^1][q[h]]+sum[q[h]]*(sum[i]-sum[q[h]]);
43             while(h<t&&slope(q[t],q[t-1])>slope(q[t-1],i)) --t;q[++t]=i;
44         }
45     }
46     printf("%lld\n",dp[k&1][n]);
47     for(int i=k,u=n;i;--i){
48         u=to[i][u];
49         print(u);
50     }
51     Ot();
52     return 0;
53 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9546240.html

洛谷P3648 [APIO2014]序列分割(斜率优化)相关推荐

  1. 洛谷 P3195 [HNOI2008]玩具装箱 —— 斜率优化

    This way 题意: 题解: 洛谷的题解就写的蛮好,首先对于斜率优化,先将它的转移方程写出来,然后对于只包含i的设为A,只包含j的设为B,然后对于含有A和B的项就是二元一次方程中的k和x 这个就可 ...

  2. 洛谷4072 SDOI2016征途 (斜率优化+dp)

    首先根据题目中给的要求,推一下方差的柿子. \[v\times m^2 = m\times \sum x^2 - 2 \times sum \times sum +sum*sum\] 所以\(ans ...

  3. BZOJ3675: [Apio2014]序列分割

    BZOJ3675: [Apio2014]序列分割 Description 小H最近迷上了一个分隔序列的游戏. 在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列. 为了得到k ...

  4. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  5. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  6. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  7. [APIO2014] 序列分割(斜率优化dp)

    problem luogu-P3648 你正在玩一个关于长度为 nnn 的非负整数序列的游戏.这个游戏中你需要把序列分成 k+1k+1k+1 个非空的块. 为了得到 k+1k+1k+1 块,你需要重复 ...

  8. BZOJ3675 [APIO2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  9. [USACO18JAN]Lifeguards P 洛谷黑题,单调队列优化DP

    传送门:戳我 这道题有两个版本,S和P,S是K等于1的情况,显然可以用线段树水过. P版本就难了很多,洛谷黑题(NOI/NOI+/CTSC),嘿嘿. 我自己也不是很理解,照着题解写了一遍,然后悟到了一 ...

最新文章

  1. 七夕要到了,用Python比心表白
  2. 遗传算法详解(GA)
  3. Spring框架学习day_01: 框架配置方式/ 管理对象的作用域/ 生命周期/ 组件扫描/ 单例模式:“懒汉式“,“饿汉式“
  4. Linux/Android多点触摸协议
  5. SAP标准成本估算删除
  6. RedHat YUM configure
  7. 修理牛棚 Barn Repair
  8. 字节增强java_提高byte的效率
  9. python连接influxdb_python 访问 InfluxDB 数据库
  10. asp.net编程基础
  11. OpenCV-图像处理(18、Laplance算子)
  12. 解析OA系统易用性的价值和意义
  13. 关于 DXGI 截图 截屏 获取屏幕
  14. web软件测试 测试报告模板_测试报告模板V1(提供下载)
  15. AUTOSAR —— CAN网络管理(CanNm)
  16. JVM和DVM的区别
  17. SAP会计借贷(转载)
  18. Maple取消假设assume变量的波浪线
  19. 通过颜色来生成一个纯色图片
  20. VMware Workstation 12

热门文章

  1. json介绍及简单示例
  2. App的selenium,Appium爬App!
  3. .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控
  4. dataTransfer对象
  5. iOS开发 - 抛出异常
  6. 页面无法访问 css文件加载问题
  7. OEA 2.11 支持单机版数据库 - SQLite与SQLCE对比
  8. BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
  9. Java编写的测试加法计算的工具
  10. 黑客攻防技术宝典Web实战篇第2版—第11章 攻击应用程序逻辑