正题

题目链接: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′​−sk​fi−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]序列分割【斜率优化】相关推荐

  1. 洛谷P3648 [APIO2014]序列分割(斜率优化)

    传送门 没想到这种多个状态转移的还能用上斜率优化--学到了-- 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...

  2. BZOJ3675: [Apio2014]序列分割

    BZOJ3675: [Apio2014]序列分割 Description 小H最近迷上了一个分隔序列的游戏. 在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列. 为了得到k ...

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

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

  4. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  5. [APIO2014] 序列分割(斜率优化dp)

    problem luogu-P3648 你正在玩一个关于长度为 nnn 的非负整数序列的游戏.这个游戏中你需要把序列分成 k+1k+1k+1 个非空的块. 为了得到 k+1k+1k+1 块,你需要重复 ...

  6. BZOJ3675 [APIO2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  7. bzoj 3675: [Apio2014]序列分割

    (一开始决策单调性证错了..(蛋疼)(其实是没有单调性的,怎么都一样),可以自己写一写i<j,先分i后分j,和先分j后分i是一样的) (而且犇蒟蒻发现斜率优化随便推上一个式子就可以了,(感觉比D ...

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

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

  9. 斜率优化DP 总结(含凸优化)

    我看了很多%d%a%l%a%o的博客,使我对其印象深刻. 确实,斜率优化的DP式一般都是: f[i]=minf[j]+a[i]∗a[j]+...f[i]=min{f[j]+a[i]*a[j]}+... ...

  10. 斜率优化DP小结(含凸优化)

    目录 斜率DP 2019.8.4 update 凸优化 斜率DP 我看了很多%d%a%l%a%o的博客,使我对其印象深刻. 确实,斜率优化的DP式一般都是: \[f[i]=min(f[j]+a[i]* ...

最新文章

  1. 创建mysql数据库,在新数据库中创建表,再尝试删除表
  2. mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》
  3. c# 单例 按需创建
  4. php ci框架 模板输出,CodeIgniter模板引擎使用实例
  5. JAVA --BYTECODE
  6. OpenGL实现高度图
  7. 为什么说 GraphQL 可以取代 REST API?
  8. udp 使用connect优点_nodejs源码分析第十九章 -- udp模块
  9. Django通过中间件实现登录验证demo
  10. Docker Redis部署_04
  11. syslog 华为 服务器_删除华为云服务器自带的探针
  12. DevExpress v15.1:XAF控件升级
  13. python将csv装入mysql_python 从csv读数据到mysql的实例
  14. 堆结构导致数据文件不能收缩
  15. java juc 包_JUC java并发包
  16. 快来了解下Snappy Ubuntu是什么
  17. 深入浅出ExtJS 第六章 布局
  18. 饮用水中如何去除硝酸盐 溴化物 铬 等有害物质
  19. 1.还不会部署高可用的kubernetes集群?看我手把手教你使用二进制部署v1.23.6的K8S集群实践(上)
  20. JS中利用AJAX调用淘宝API获取网络时间的方法

热门文章

  1. devexpress 中的checkboxlist怎么设置间距_HTML中怎么设置h1的字体样式你知道吗?关于设置h1标签的样式详解
  2. mysql slave 1032_修复mysql slave复制1032错误
  3. 华为服务器如何用pe重装系统,教你华为u盘重装win10系统详细图文
  4. linux中显示目录名,在linux下显示中文目录和文件名
  5. 实现option上下移动_用jQuery实现lt;selectgt;选项上下移动 - 不要哀求 学会争取 若是如此 终有所获 - ITeye博客...
  6. [Java基础]为什么会出现字符流?与编码表介绍
  7. [剑指offer]面试题15:链表中倒数第k个结点
  8. AcWing 1113. 红与黑
  9. 算法-二分搜索-找出最大值和次大值
  10. Codeforces Round #719 (Div. 3)/ Codeforces Round #720 (Div. 2)