P3648-[APIO2014]序列分割【斜率优化】
正题
题目链接:https://www.luogu.com.cn/problem/P3648
题目大意
nnn个数字的序列,分割kkk次,每次的权值是左右两块数字的乘积。求最大权值和分割方案。
解题思路
显然分割顺序不会影响结果,一个分割方式的答案是每一块与其他块的乘积之和。
考虑dpdpdp,fi,jf_{i,j}fi,j表示第iii次分割,到第jjj个时的方案数,有转移
fi,j=max{fi−1,k+(sj−sk)∗sk}f_{i,j}=max\{f_{i-1,k}+(s_j-s_k)*s_k\}fi,j=max{fi−1,k+(sj−sk)∗sk}
考虑两个方案k′<kk'<kk′<k的优劣性
fi−1,k+sj∗sk−sk2>fi−1,k′+sj∗sk′−sk′2f_{i-1,k}+s_j*s_k-s_k^2>f_{i-1,k'}+s_j*s_{k'}-s_{k'}^2fi−1,k+sj∗sk−sk2>fi−1,k′+sj∗sk′−sk′2
fi−1,k+sj∗sk−fi−1,k′+sk′2>sj∗(sk′−sk)f_{i-1,k}+s_j*s_k-f_{i-1,k'}+s_{k'}^2>s_j*(s_{k'}-s_{k})fi−1,k+sj∗sk−fi−1,k′+sk′2>sj∗(sk′−sk)
fi−1,k+sj∗sk−fi−1,k′+sk′2sk′−sk<sj\frac{f_{i-1,k}+s_j*s_k-f_{i-1,k'}+s_{k'}^2}{s_{k'}-s_{k}}<s_jsk′−skfi−1,k+sj∗sk−fi−1,k′+sk′2<sj
因为sjs_jsj递增,所以单调队列维护一个上突壳即可
然后记录一下前驱输出方案
时间复杂度O(nk)O(nk)O(nk)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110000;
ll n,k,q[N],fa[210][N],s[N],f[2][N];
double slope(ll z,ll x,ll y){if(s[y]==s[x])return -1e18;return (f[z][x]-f[z][y]-s[x]*s[x]+s[y]*s[y])/(double)(s[y]-s[x]);
}
int main()
{scanf("%lld%lld",&n,&k);for(ll i=1;i<=n;i++)scanf("%lld",&s[i]),s[i]+=s[i-1];memset(f,0,sizeof(f));for(ll i=1;i<=k;i++){ll head=1,tail=0;memset(f[i&1],0,sizeof(f[i&1]));for(ll j=1;j<=n;j++){while(head<tail&&slope(~i&1,q[head],q[head+1])<=s[j])head++;f[i&1][j]=0;if(head<=tail){ll x=q[head];fa[i][j]=x;f[i&1][j]=f[~i&1][x]+(s[j]-s[x])*s[x];}while(head<tail&&slope(~i&1,q[tail],q[tail-1])>=slope(~i&1,j,q[tail]))tail--;q[++tail]=j;}}printf("%lld\n",f[k&1][n]);for(ll i=k,w=fa[k][n];i;w=fa[--i][w])printf("%lld ",w);
}
P3648-[APIO2014]序列分割【斜率优化】相关推荐
- 洛谷P3648 [APIO2014]序列分割(斜率优化)
传送门 没想到这种多个状态转移的还能用上斜率优化--学到了-- 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...
- BZOJ3675: [Apio2014]序列分割
BZOJ3675: [Apio2014]序列分割 Description 小H最近迷上了一个分隔序列的游戏. 在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列. 为了得到k ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...
- [APIO2014] 序列分割(斜率优化dp)
problem luogu-P3648 你正在玩一个关于长度为 nnn 的非负整数序列的游戏.这个游戏中你需要把序列分成 k+1k+1k+1 个非空的块. 为了得到 k+1k+1k+1 块,你需要重复 ...
- BZOJ3675 [APIO2014]序列分割
Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...
- bzoj 3675: [Apio2014]序列分割
(一开始决策单调性证错了..(蛋疼)(其实是没有单调性的,怎么都一样),可以自己写一写i<j,先分i后分j,和先分j后分i是一样的) (而且犇蒟蒻发现斜率优化随便推上一个式子就可以了,(感觉比D ...
- 斜率优化dp 的简单入门
不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...
- 斜率优化DP 总结(含凸优化)
我看了很多%d%a%l%a%o的博客,使我对其印象深刻. 确实,斜率优化的DP式一般都是: f[i]=minf[j]+a[i]∗a[j]+...f[i]=min{f[j]+a[i]*a[j]}+... ...
- 斜率优化DP小结(含凸优化)
目录 斜率DP 2019.8.4 update 凸优化 斜率DP 我看了很多%d%a%l%a%o的博客,使我对其印象深刻. 确实,斜率优化的DP式一般都是: \[f[i]=min(f[j]+a[i]* ...
最新文章
- 创建mysql数据库,在新数据库中创建表,再尝试删除表
- mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》
- c# 单例 按需创建
- php ci框架 模板输出,CodeIgniter模板引擎使用实例
- JAVA --BYTECODE
- OpenGL实现高度图
- 为什么说 GraphQL 可以取代 REST API?
- udp 使用connect优点_nodejs源码分析第十九章 -- udp模块
- Django通过中间件实现登录验证demo
- Docker Redis部署_04
- syslog 华为 服务器_删除华为云服务器自带的探针
- DevExpress v15.1:XAF控件升级
- python将csv装入mysql_python 从csv读数据到mysql的实例
- 堆结构导致数据文件不能收缩
- java juc 包_JUC java并发包
- 快来了解下Snappy Ubuntu是什么
- 深入浅出ExtJS 第六章 布局
- 饮用水中如何去除硝酸盐 溴化物 铬 等有害物质
- 1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)
- JS中利用AJAX调用淘宝API获取网络时间的方法
热门文章
- devexpress 中的checkboxlist怎么设置间距_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解
- mysql slave 1032_修复mysql slave复制1032错误
- 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
- linux中显示目录名,在linux下显示中文目录和文件名
- 实现option上下移动_用jQuery实现lt;selectgt;选项上下移动 - 不要哀求 学会争取 若是如此 终有所获 - ITeye博客...
- [Java基础]为什么会出现字符流?与编码表介绍
- [剑指offer]面试题15:链表中倒数第k个结点
- AcWing 1113. 红与黑
- 算法-二分搜索-找出最大值和次大值
- Codeforces Round #719 (Div. 3)/ Codeforces Round #720 (Div. 2)