Description

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

1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列——也就是一开始得到的整个序列);

2.选择一个位置,并通过这个位置将这个序列分割成连续的两个非空的新序列。

每次进行上述步骤之后,小H将会得到一定的分数。这个分数为两个新序列中元素和的乘积。小H希望选择一种最佳的分割方式,使得k轮之后,小H的总得分最大。


随手列个柿子就会发现断点的选择顺序对于答案是没有影响的

\(f_{ij}\)表示前i个数字里加了j个断点的最大贡献

\[f_{i,j}=max(f_{i-1,k}+sum_k\times (sum_i-sum_k))(k< i)
\]

设\(f\)表示\(f_{i-1}\)(。。。

那么对于\(k\)比\(l\)更优当且仅当

\[f_k+sum_k\times (sum_i-sum_k)>f_l+sum_l\times (sum_i-sum_l)
\]

\[s_i>\frac{sum_l^2-sum_k^2+f_l-f_k}{s_l-s_k}
\]

斜率优化!!


#include<iostream>
#include<cstdio>
#include<cstring>
#define M 110001
#define LL long long
using namespace std; int u,m,n,k,q[M],t,h,pre[M][210];
LL f[2][M],s[M];
double xl(int k,int l,int u)
{
if(s[k]==s[l]) return -1e18;
return (1.0*(long double)(-f[u][l]+f[u][k]-((long double)s[k]*s[k])+((long double)s[l]*s[l]))*1.0/((long double)1.0*(-s[k]+s[l])));
} int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&m),s[i]=(LL)s[i-1]+m;
for(int j=1;j<=k;j++)
{
h=t=0; u=j&1;
for(int i=1;i<=n;i++)
{
while(t>h && xl(q[h+1],q[h],!u)<=(long double)s[i]) h++;
int x=q[h]; pre[i][j]=x;
f[u][i]=f[!u][x]+s[x]*(s[i]-s[x]);
while(t>h && xl(q[t],q[t-1],!u)>=xl(i,q[t],!u)) t--;
q[++t]=i;
}
}
printf("%lld\n",f[k&1][n]);
LL x=n;
for(LL i=k;i>=1;i--)
{
printf("%lld ",pre[x][i]);
x=pre[x][i];
}
}

3675: [Apio2014]序列分割的更多相关文章

  1. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 427[Submit][Statu ...

  2. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  3. bzoj 3675 [Apio2014]序列分割(斜率DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3675 [题意] 将n个数的序列分割k次,每次的利益为分割后两部分数值和的积,求最大利益 ...

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

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

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

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

  6. 【BZOJ】3675: [Apio2014]序列分割

    http://www.lydsy.com/JudgeOnline/problem.php?id=3675 题意:给一个n个数字的序列,每一次分割的贡献是$sum(left, mid)*sum(mid+ ...

  7. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    题目链接 BZOJ 3675 首先最后的答案和分割的顺序是无关的, 那么就可以考虑DP了. 设$f[i][j]$为做了$i$次分割,考虑前$j$个数之后的最优答案. 那么$f[i][j] = max( ...

  8. BZOJ 3675 [Apio2014]序列分割 (斜率优化DP)

    洛谷传送门 题目大意:让你把序列切割k次,每次切割你能获得 这一整块两侧数字和的乘积 的分数,求最大的分数并输出切割方案 神题= = 搞了半天也没有想到切割顺序竟然和答案无关...我太弱了 证明很简单 ...

  9. bzoj 3675: [Apio2014]序列分割【斜率优化dp】

    首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...

随机推荐

  1. Visual studio 2017 Installer 打包.netframework

    前几步和网上其他教程一样的.主要是把.net framework 打包进安装程序里,如果选的是“从与我的应用程序相同的位置下载系统必备组件”,会提示 ERROR: 要在“系统必备”对话框中启用“从与我 ...

  2. 导航栏pop拦截

    一.新建一个分类 二.导入分类头文件 三.需要拦截的地方实现方法   - (BOOL)navigationShouldPopTwo  即可 .h #import <UIKit/UIKit.h&g ...

  3. 自定义一个可以动态折叠的UITAbleViewCell

    看到code 4APP上有一个折叠的UITAbleViewCell,不过是swift的,所以自己尝试做一个简单的可折叠的UITAbleViewCell 主要实现一个可以折叠的UITAbleViewCe ...

  4. 安装svn过程

    1.SVN服务器端程序安装 --检测是否安装成功:svn --version2.创建版本库(仓库) 命令格式:svnadmin create 仓库的目录 3.启动服务器 <1>命令行方式 ...

  5. 如何在SpringMVC中使用REST风格的url

    如何在SpringMVC中使用REST风格的url 1.url写法: get:/restUrl/{id} post:/restUrl delete:/restUrl/{id} put:/restUrl ...

  6. 设计模式(12)--Proxy(代理模式)--结构型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. ...

  7. CF712E Memory and Casinos

    设\(f[i]\)为从\(i\)到\(r+1\)且不走出区间的概率 \(f[i]=p[i]f[i+1]+(1-p[i])f[i-1]\) \(f[i]-f[i-1]=p[i](f[i+1]-f[i-1 ...

  8. css BFC布局及用处

    http://www.cnblogs.com/lhb25/p/inside-block-formatting-ontext.html 这篇文章讲的很简单很实用

  9. eclipse安装可视化swing插件

    众所周知,eclipse作为Java的主流IDE之一,拥有强大的插件功能.这里介绍一种,必要时刻需要做一点awt或者swing时能派上用场. 进入下面的链接,官网下载组件 http://www.ecl ...

  10. [WPF 知识总结系列] —— 基本控件的简单样式集合

    一.ScrollBar <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presenta ...