bzoj 3675 [Apio2014]序列分割(斜率DP)
【题目链接】
http://www.lydsy.com/JudgeOnline/problem.php?id=3675
【题意】
将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益。
【思路】
设f[i][j]表示将前i个分割j次的最大获益,则有转移式:
f[i][j]=max{ f[k][j-1]+(S(i)-S(k))*S(k) }
设a<b,若b决策优于a决策则有:
(S[b]^2-S[a]^2+f[a][j-1]-f[b][j-1])/(S[b]-S[a])<S[i]
单调队列维护下凸包,每次保持队首的最优性,维护队尾的下凸性。队列中的点至少要有一个。
【代码】
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} int n,K,tot;
ll f[N][],cur,q[N],qh,qt,a[N],S[N];
/*
double slop(ll a,ll b) {
return (double)(S[b]*S[b]-S[a]*S[a]+f[a][cur^1]-f[b][cur^1])/(double)(S[b]-S[a]);
}
*/
ll up(ll a,ll b)
{
return (S[b]*S[b]-S[a]*S[a]+f[a][cur^]-f[b][cur^]);
}
ll down(ll a,ll b)
{
return (S[b]-S[a]);
} int main()
{
n=read(),K=read();
FOR(i,,n) {
a[++tot]=read();
if(!a[tot]) --tot;
}
n=tot;
FOR(i,,n) S[i]=S[i-]+a[i];
FOR(round,,K) {
cur^=;
qh=; qt=;
FOR(i,round,n) {
while(qh<qt&up(q[qh],q[qh+])<S[i]*down(q[qh],q[qh+])) qh++;
int t=q[qh];
f[i][cur]=f[t][cur^]+(S[i]-S[t])*S[t];
while(qh<qt&&up(q[qt-],q[qt])*down(q[qt-],i)>up(q[qt-],i)*down(q[qt-],q[qt])) qt--;
q[++qt]=i;
}
}
printf("%lld\n",f[n][cur]);
return ;
}
bzoj 3675 [Apio2014]序列分割(斜率DP)的更多相关文章
- BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)
洛谷传送门 题目大意:让你把序列切割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首 ...
- bzoj 3675: [Apio2014]序列分割【斜率优化dp】
首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...
- BZOJ 3675 APIO2014 序列切割 斜率优化DP
题意:链接 方法:斜率优化DP 解析:这题BZ的数据我也是跪了,特意去网上找到当年的数据后面二十个最大的点都过了.就是过不了BZ. 看到这道题自己第一发DP是这么推得: 设f[i][j]是第j次分第i ...
- BZOJ 3675: [Apio2014]序列分割 动态规划 + 斜率优化 + 卡精度
Code: #include<bits/stdc++.h> #define N 100006 #define M 205 #define ll long long #define setI ...
随机推荐
- Hibernate逍遥游记-第13章 映射实体关联关系-005双向多对多(使用组件类集合\<composite-element>\)
1. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hi ...
- python 利用imap接收邮件,并保存附件
def SaveAttachImap():# login the imap server ,retrive the new mails ,and download the attachments. ...
- 获取其他进程中ListBox和ComboBox的内容
(*// 标题:获取其他进程中ListBox和ComboBox的内容 说明:Window2000+Delphi6调试通过 设计:Zswang 支持:wjhu111@21cn.com 日期:2004-0 ...
- 关于Javascript函数的几点笔记
函数本质上是一个有名字的程序块,程序块使得多条语句可以一起执行. 变量类型: 1.复杂类型:Object.Array等. 2.原始类型:String.Integer等. 函数参数: 1.复杂类型:传递 ...
- Xwindow的文章
http://blog.csdn.net/crond123/article/details/5733776 http://bbs.csdn.net/topics/90377015 http://bbs ...
- C# progressbar 用法
http://blog.chinaunix.net/uid-9236609-id-3069624.html progressBar1.Maximum = 100;//设置最大长度值 ...
- ios7新增基础类库以及OC新特性
新特性: Modules:用XCode5新建工程默认支持modules编译,老项目需在Build Settings里查找modules,找到的Enable Modules选项设置为YES. 对应新增语 ...
- gsp序列模式挖掘
数据挖掘进阶之序列模式挖掘GSP算法 绪 继续数据挖掘方面算法的讲解,前面讲解了数据挖掘中关联规则算法FP-Growth的实现.此篇博文主要讲解基于有趣性度量标准的GSP序列模式挖掘算法.有关论文后期 ...
- BZOJ2626: JZPFAR
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2626 题解:裸K-Dtree,最大值?自己yy一下估价函数就好了. 两题居然是同一个错误,真是 ...
- Web网站的性能测试工具
随着Web 2.0技术的迅速发展,许多公司都开发了一些基于Web的网站服务,通常在设计开发Web应用系统的时候很难模拟出大量用户同时访问系统的实际情况,因此,当Web网站遇到访问高峰时,容易发生服务器 ...