【BZOJ3675】序列统计,斜率优化DP
传送门
写在前面:停课的开始
思路:
这是一道有点丧病的斜率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相关推荐
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- NOI2007 货币兑换 - CDQ分治斜率优化dp
斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
- 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)
dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- 【总结】斜率优化DP
于是,XSC062开始写总结. 斜率优化DP 前置芝士 单调队列优化DP(夹带私货) 正文 我们以一道题为例. 打印文章 双倍经验 三倍经验 Solution 明显DP. 那么DP式就是: f i = ...
- 斜率优化dp (P2365/P5785 任务安排)
斜率优化dp P2365 任务安排 解法一 O(N^3): 解法二:O(N^2): 代码如下: 解法三 O(N): 凸壳: 综上所述: 代码如下: P5785 [SDOI2012]任务安排 分析: 代 ...
- BZOJ 2149 拆迁队 斜率优化DP 主席树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2149 题目大意: 一个长度为 n n的序列aa,改变其中的某些数使之成为一个单调递增序列, ...
- bzoj 1597: [Usaco2008 Mar]土地购买(斜率优化dp 例题)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- 「APIO2010」 特别行动队 - 斜率优化Dp
题目描述 你有一支由nnn名预备役士兵组成的部队,士兵从1到nnn编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,...,i+k) ...
最新文章
- 参加峰会“金点子”的材料
- 启用Apache Mod_rewrite模块
- 重复提交版本之后该采取的测试策略
- sql server排序慢_用Nginx实现接口慢查询并可示化展示TOP 20
- 在QLabel上同时显示文字和图片的方法
- 学习JavaScript 的必备
- Linux学习之用户管理和组管理
- java color类 蓝色_java中Color类的简单总结
- .NET Core 2.1 容器镜像将从 Docker Hub 中删除
- js 难点之call,apply实现
- 前端:CSS/13/HTML引入CSS的方法,CSS表格属性,盒子模型,上下外边距合并
- python网页请求超时_python爬虫多次请求超时的几种重试方法(6种)
- 吴恩达机器学习训练1:线性回归(多变量)
- ssh创建密钥对验证
- shell脚本学习指南_学习笔记_第1,2章
- wireshark提示未启动npf服务The NPF driver isn’t running You may have trouble capturing or listing interfaces
- 创业冲突的五种解决方法是_避免创业合伙人之间发生冲突的四种方法
- 兔年新春,快来领取你的春节全屏动效吧
- Android 自定义二维码
- 苹果关闭 iOS 14.4.2 系统验证通道
热门文章
- Tensorflow Serving Docker compose 部署服务细节(Ubuntu)
- android打包闪退,使用最新hx 进行android打包闪退
- oracle数据库表excel文件位置,Excel数据导入到oracle数据库表方法
- java web部分问题以及解决方案
- 关于Python生成器的一个小问题(StopIteration)
- 【李宏毅机器学习】Convolutiona Neural Network 卷积神经网络(p17) 学习笔记
- python线性回归实例_python线性回归示例
- pm2 多个线程输出一个日志_PM2 源码分析
- 运维组如何管理服务器资源,运维服务管理体系方案全套.doc
- vuex commit 模块_长篇连载:Vuex源码学习(二)脉络梳理