BZOJ 3675 序列分割
斜率优化。注意要判分母为0的情况。dp数组可以滚一维。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100500
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
long long n,k,a[maxn],sum[maxn],q[maxn],l=,r=,dp[][maxn],g[maxn],ans=;
double ks(long long x,long long y)
{
if (sum[x]==sum[y]) return inf;
return (double)(g[x]-g[y])/(sum[x]-sum[y]);
}
void dps()
{
for (long long i=;i<=n-;i++)
{
dp[][i]=sum[i]*(sum[n]-sum[i]);
g[i]=dp[][i]-sum[n]*sum[i];ans=max(ans,dp[][i]);
}
for (long long i=;i<=k;i++)
{
l=r=;q[l]=i-;
for (long long j=i;j<=n-;j++)
{
while ((r-l) && (ks(q[l],q[l+])>=-sum[j])) l++;
dp[i&][j]=dp[(i&)^][q[l]]+(sum[n]-sum[j])*(sum[j]-sum[q[l]]);
ans=max(ans,dp[i&][j]);
while ((r-l) && (ks(q[r-],q[r])<ks(q[r],j))) r--;
q[++r]=j;
}
for (long long j=i;j<=n-;j++) g[j]=dp[i&][j]-sum[n]*sum[j];
}
}
int main()
{
scanf("%lld%lld",&n,&k);
for (long long i=;i<=n;i++) {scanf("%lld",&a[i]);sum[i]=sum[i-]+a[i];}
dps();
printf("%lld\n",ans);
return ;
}
BZOJ 3675 序列分割的更多相关文章
- BZOJ 3675: 序列分割 (斜率优化dp)
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- 【BZOJ】【3675】【APIO2014】序列分割
DP+斜率优化 首先我们根据这个分割的过程可以发现:总得分等于k+1段两两的乘积的和(乘法分配律),也就是说与分割顺序是无关的. 再对乘积进行重分组(还是乘法分配律)我们可以转化为:$ans=\sum ...
- bzoj 3675 [Apio2014]序列分割(斜率DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ...
- 【斜率DP】BZOJ 3675:[Apio2014]序列分割
3675: [Apio2014]序列分割 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1066 Solved: 427[Submit][Statu ...
- BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )
WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...
- bzoj 3675: [Apio2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- 3675: [Apio2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
随机推荐
- css中vw,vh单位对于UC的兼容性问题
vw,vh单位在移动端浏览器不兼容,在网上找半天也没找到什么官方的解决方法:我就试了一下在使用到vh的单位之前添加一个用px定义的样式: 如: 当浏览器不是别100vw单位的时候 就会赋给px单位的样 ...
- Oracle 乱码
导入DMP之后 ..... 1.Oacle数据库表中数据乱码 请检查导出DMP的ORACLE数据库编码设置 修改ORACLE编码与原DMP导出编码一致 select userenv('language ...
- 初识less
1 less 安装使用 安装 sudo npm install node-less 使用 mkdir less cd /less lessc demo1.less > test1.css les ...
- 51nod 1181 质数中的质数(质数筛法)
题目链接:51nod 1181 质数中的质数(质数筛法) #include<cstdio> #include<cmath> #include<cstring> #i ...
- Linux系统的初化始配置(包括配置网络,修改主机名,关闭firewalld与selinux的生效)
一.配置网络环境 1.运行 cmd 查看本机的ip地址,然后记录下来. 2.网络和共享中心--本地连接属性如下: 手工配置到本地连接上面 IP:172.16.191.215,DNS:101.7.8.9 ...
- 每天一个percona 工具 --- pt-kill
主要用途:pt-kill是用来kill MySQL连接的一个工具,在MySQL中因为空闲连接较多导致超过最大连接数,或某个有问题的sql导致mysql负载很高时,需要将其KILL掉来保证服务器正常运行 ...
- ftgl 绘制文字
FTFont* ftfont = new FTGLPixmapFont(); ftfont->Open("D:/SIMHEI.ttf"); ftfont->FaceSi ...
- css 分享之background-attachment 属性
微分享才发现的css背景图达到的效果代码属性: background-attachment -- 定义背景图片随滚动轴的移动方式: 值 描述 scroll 默认值.背景图像会随着页面其余部分的滚动而移 ...
- java selenium (三) 环境搭建 基于Maven
现在Java的大部分项目都是基于Maven, 在Maven项目中使用Selenium2. 非常简单. 首先你需要配置好Maven的环境 可以参考本博客的Maven教程系列,Maven入门教程(一) ...
- toolsqa-IMPORTANCE
http://toolsqa.com/cucumber/cucumber-options/