传送门
写在前面:停课的开始
思路:
这是一道有点丧病的斜率DP。
首先发现,如果要切位置i和j,那么先切i和先切j得到的是同样的结果(只是想着应该是这样,用暴力试了一下,但太弱不会证明)
我的DP方程好像和网上的不太一样
f[i][j]是指在第j个数的前面”砍“第i下的最大值(即把第j个数当作第i段的末尾)那么转移方程就显而易见了
f[i][j]=max(f[i−1][p]+(sum[n]−sum[j])∗(sum[j]−sum[p]))p=0..jf[i][j]=max(f[i-1][p]+(sum[n]-sum[j])*(sum[j]-sum[p])) p=0..j
最终答案是max(f[k][i])其中i=1..n−1max(f[k][i])其中i=1..n-1
(sum[x]=∑xi=1a[i]sum[x]=∑^x_{i=1}a[i])
设x>y且x优于y的转移,则
(f[x]−f[y])/(sum[x]−sum[y])>sum[n]−sum[j](f[x]-f[y])/(sum[x]-sum[y])>sum[n]-sum[j]
而且计算100000*200*8/1024/1024≈152,空间爆炸,所以开滚动数组,队列记录上一次的转移,head和tail也要做些小处理,答案用long long计算
然后就过了样例,欢天喜地地交上去了
不出4ms就WA了……
又试了一组数据,发现和暴力结果不同
os:好像数据中0比较多?
结果看了眼std发现要特判0?
os:???
想了好久发现判断斜率时的sum[x]−sum[y]sum[x]-sum[y]可能会因为a[x]=0而除0出错(除以实数0会爆出一些奇怪的东西(‵~′))……
所以要判0啊!判0啊!
附上文所说的证明(转自DaD3zZ):

大体上假设某串为abcdabcd,如果最后要分割成a|b|cda|b|cd那么
先分割成ab|cdab|cd当前答案为a∗cd+b∗cda∗cd+b∗cd,再分割成a|b|cda|b|cd,答案为a∗b+a∗cd+b∗cda∗b+a∗cd+b∗cd
先分割成a|bcda|bcd当前答案为a∗bcda∗bcd,在分割成a|b|cda|b|cd,答案为a∗bcd+b∗cda∗bcd+b∗cd
那么两式化一化就可以发现得到的是相同的。所以,对于其余的也合适;

注意:判0啊!
代码:

#include<bits/stdc++.h>
#define M 100002
#define LL long long
using namespace std;
int n,k,a[M],head[2],tail[2],q[2][M];
LL sum[M],f[2][M],ans;
bool mk;
double Get(bool i,int x,int y)
{if (sum[x]==sum[y]) return 0;   return (double)(f[i][x]-f[i][y])/(double)(sum[x]-sum[y]);
}
main()
{scanf("%d%d",&n,&k);for (int i=1;i<=n;i++)scanf("%d",a+i),sum[i]=sum[i-1]+a[i];head[0]=tail[0]=1;for (int i=1;i<=k;i++){mk^=1;head[mk]=tail[mk]=1;for (int j=1;j<n;j++){while (head[!mk]<tail[!mk]&&Get(!mk,q[!mk][head[!mk]+1],q[!mk][head[!mk]])>sum[n]-sum[j]) head[!mk]++;f[mk][j]=f[!mk][q[!mk][head[!mk]]]+(sum[n]-sum[j])*(sum[j]-sum[q[!mk][head[!mk]]]);while (head[mk]<tail[mk]&&Get(mk,j,q[mk][tail[mk]])>Get(mk,q[mk][tail[mk]],q[mk][tail[mk]-1])) tail[mk]--;q[mk][++tail[mk]]=j;}}for (int i=1;i<n;i++)    ans=max(ans,f[mk][i]);printf("%lld",ans);
}

冷静下来,重新看看题目,其实和之前的斜率DP没什么两样,但也许是觉得太模式化了,连最基本的除0错误都忽略掉了,不得不说是对于细节的把握力不够而导致的,也许再细心一些,就能在不通过外力的情况下找出这种小错误了

【BZOJ3675】序列统计,斜率优化DP相关推荐

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

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

  2. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

  3. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  4. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  5. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  6. 【总结】斜率优化DP

    于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...

  7. 斜率优化dp (P2365/P5785 任务安排)

    斜率优化dp P2365 任务安排 解法一 O(N^3): 解法二:O(N^2): 代码如下: 解法三 O(N): 凸壳: 综上所述: 代码如下: P5785 [SDOI2012]任务安排 分析: 代 ...

  8. BZOJ 2149 拆迁队 斜率优化DP 主席树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...

  9. bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

  10. 「APIO2010」 特别行动队 - 斜率优化Dp

    题目描述 你有一支由nnn名预备役士兵组成的部队,士兵从1到nnn编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,...,i+k) ...

最新文章

  1. 参加峰会“金点子”的材料
  2. 启用Apache Mod_rewrite模块
  3. 重复提交版本之后该采取的测试策略
  4. sql server排序慢_用Nginx实现接口慢查询并可示化展示TOP 20
  5. 在QLabel上同时显示文字和图片的方法
  6. 学习JavaScript 的必备
  7. Linux学习之用户管理和组管理
  8. java color类 蓝色_java中Color类的简单总结
  9. .NET Core 2.1 容器镜像将从 Docker Hub 中删除
  10. js 难点之call,apply实现
  11. 前端:CSS/13/HTML引入CSS的方法,CSS表格属性,盒子模型,上下外边距合并
  12. python网页请求超时_python爬虫多次请求超时的几种重试方法(6种)
  13. 吴恩达机器学习训练1:线性回归(多变量)
  14. ssh创建密钥对验证
  15. shell脚本学习指南_学习笔记_第1,2章
  16. wireshark提示未启动npf服务The NPF driver isn’t running You may have trouble capturing or listing interfaces
  17. 创业冲突的五种解决方法是_避免创业合伙人之间发生冲突的四种方法
  18. 兔年新春,快来领取你的春节全屏动效吧
  19. Android 自定义二维码
  20. 苹果关闭 iOS 14.4.2 系统验证通道

热门文章

  1. Tensorflow Serving Docker compose 部署服务细节(Ubuntu)
  2. android打包闪退,使用最新hx 进行android打包闪退
  3. oracle数据库表excel文件位置,Excel数据导入到oracle数据库表方法
  4. java web部分问题以及解决方案
  5. 关于Python生成器的一个小问题(StopIteration)
  6. 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
  7. python线性回归实例_python线性回归示例
  8. pm2 多个线程输出一个日志_PM2 源码分析
  9. 运维组如何管理服务器资源,运维服务管理体系方案全套.doc
  10. vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理