一、斜率优化DP与决策单调性

这里浅显(并且不严谨)地说明一下标题中的两个名词:

斜率优化DP:状态转移方程形如f[i]=min/max{f[k]+(x[i]-x[k])^y}的一类DP问题;

决策单调性:若对于状态i,有决策t<k,且k优于t,则对于任意状态v>i,存在决策k优于t。

对以上两条说明的不严谨与模糊之处,下文将结合题目给出(依旧不严谨且模糊的)一定程度上的解释。

二、题目

Description

Pine开始了从S地到T地的征途。
从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。

Input

第一行两个数 n、m。
第二行 n 个数,表示 n 段路的长度

Output

一个数,最小方差乘以 m^2 后的值

Sample Input

5 2
1 2 5 8 6

Sample Output

36

HINT

1≤n≤3000,保证从 S 到 T 的总路程不超过 30000

附上原题链接→_→Problem 4518. -- [Sdoi2016]征途

三、题目分析

为方便书写,作出如下约定:

a[i]:题目给出的第i段路程长;

sum[i]:路程长的前缀和;

x[i]:第i天走过的路程总和。

根据题意,每天走过的路程长度的方差表示为:

整理得:

显然,由于上式中只有x[i]为变量,问题自然转化成了求∑x2[i]的最小值。

设计状态转移方程如下:

其中,f[i][j]表示前j天走过前i段路程,每天路程平方和的最小值。

观察到状态转移方程的形式基本符合斜率优化DP的形式,于是固定j,并:

令t<k:

当t优于k:

整理得:

同理,当k优于t:

由于s[i]单调递增,故若在状态i下有k优于t,则对于任意v>i,存在k优于t。

这就意味着,如果我们在某个状态时发现决策k优于t,我们便再也不需要访问决策t了。这就利用决策单调性,达到了降低时间复杂度的效果。

此外,还可以发现,在某个状态下的有效决策形成了一个下凸壳。粗略证明如下:

设坐标系中存在点A、B、C,其横坐标单调递增,其对应决策简称为决策A、B、C

当B的纵坐标大于A、C的纵坐标(形成了一个上凸壳):

  1. 2s[i]<kBC:决策A优于决策B,决策B优于决策C,故决策A最优;
  2. kBC<2s[i]<kAB:决策A优于决策B,决策C优于决策B,故决策A或C最优;
  3. 2s[i]>kAB:决策B优于决策A,决策C优于决策B,故决策C最优。

以上,形成上凸壳时,决策B不可能成为最优决策,故删去点B,上凸壳性质被破坏;

同理,当B的纵坐标小于A、C的纵坐标(形成了一个下凸壳):

  1. 2s[i]<kAB:决策A优于决策B,决策B优于决策C,故决策A最优;
  2. kAB<2s[i]<kBC:决策B优于决策A,决策B优于决策C,故决策B最优;
  3. 2s[i]>kBC:决策B优于决策A,决策C优于决策B,故决策C最优。

故形成下凸壳时,所有决策均有可能成为最优决策。

这样,我们用一个双端队列就能维护可能成为最优决策的的决策,始终保证队首元素最优,队列满足下凸壳性质。

四、代码实现

其实f数组不需要开二维,因为我们每次只用到了f[i][j]和f[i][j-1],所以可以再压去一维。但为方便理解,博主仍使用二维f数组。

 #include<cstdio>
const int MAXN=3e3+;
int n,m;
int s[MAXN];
int q[MAXN],l,r;
long long f[MAXN][MAXN];
double count_y(int k,int j){return f[k][j-]+s[k]*s[k];}
double count(int t,int k,int j){return (count_y(t,j)-count_y(k,j))/(s[t]-s[k]);}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
int x;
scanf("%d",&x);
s[i]=s[i-]+x;
}
for(int i=;i<=n;++i)f[i][]=s[i]*s[i];
for(int j=;j<=m;++j)
{
l=,r=;
for(int i=;i<=n;++i)
{
while(l<r&&count(q[l],q[l+],j)<*s[i])++l;
int temp=q[l];
f[i][j]=f[temp][j-]+(s[i]-s[temp])*(s[i]-s[temp]);
while(l<r&&count(q[r],i,j)<count(q[r-],q[r],j))--r;
q[++r]=i;
}
}
printf("%lld\n",f[n][m]*m-(long long)s[n]*s[n]);
return ;
}

bzoj4518-征途

弱弱地说一句,本蒟蒻码字也不容易,转载请注明出处http://www.cnblogs.com/Maki-Nishikino/p/6523852.html

【斜优DP】bzoj4518-Sdoi2016征途的更多相关文章

  1. BZOJ4518 Sdoi2016 征途 【斜率优化DP】 *

    BZOJ4518 Sdoi2016 征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m ...

  2. bzoj4518[Sdoi2016]征途 斜率优化dp

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1657  Solved: 915[Submit][Status] ...

  3. BZOJ4518: [Sdoi2016]征途(dp+斜率优化)

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1875  Solved: 1045[Submit][Status][Discuss] Descript ...

  4. bzoj4518: [Sdoi2016]征途--斜率DP

    题目大意:把一个数列分成m段,计算每段的和sum,求所有的sum的方差,使其最小. 由方差*m可以化简得ans=m*sigma(ki^2)-sum[n]^2 很容易得出f[i][j]=min{f[i- ...

  5. 2018.09.08 bzoj4518: [Sdoi2016]征途(斜率优化dp)

    传送门 把式子展开后发现就是要求: m∗(∑i=1msum′[i])−sum[n]2" role="presentation" style="position: ...

  6. bzoj4518: [Sdoi2016]征途(DP+决策单调性分治优化)

    题目要求... 化简得... 显然m和sum^2是已知的,那么只要让sigma(si^2)最小,那就变成了求最小平方和的最小值,经典的决策单调性,用分治优化即可. 斜率优化忘得差不多就不写了 #inc ...

  7. [bzoj4518][Sdoi2016]征途-斜率优化

    Brief Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须 ...

  8. BZOJ4518: [Sdoi2016]征途

    Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜 ...

  9. [luogu4072][bzoj4518][SDOI2016]征途【动态规划+斜率优化】

    题目分析 Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地.除第m天外,每一天晚上Pine都必须在休息站过夜.所以,一段路 ...

随机推荐

  1. ifconfig不显示网卡eth0

    参考资料:http://blog.itpub.net/25851087/viewspace-1700568/ 在/etc/sysconfig/network-script/ifcfg-eth0网卡配置 ...

  2. CSS规范 - 典型错误--(来自网易)

    不符合NEC规范的选择器用法 .class{} 不要以一个没有类别的样式作为主选择器,这样的选择器只能作为后代选择器使用,比如.m-xxx .class{}.        .m-xxx div{} ...

  3. [整理]ASP.NET MVC 5

    1.入门 1.1官方资料 http://www.asp.net/mvc/overview/getting-started/introduction/getting-started 疑问: startu ...

  4. HDU 4472 Count DP题

    解题报告:题目大意,给你n个球,要将这n个球从下到上按层次排列,要求同一个层次的的每一个分支的数量都必须相等,问有多少种排列的方法. 此题的一个DP题,假设现在有n个球,要将这n个球排列好,我们就必须 ...

  5. MySQL-数据操作-增删改查

    1.增加: insert into 表 (列名,列名...) values (值,值,值...) insert into 表 (列名,列名...) values (值,值,值...),(值,值,值.. ...

  6. C# 解决VS2008在win7找不到输入序列号的地方

    1.VS2008在Windows7 打开维护界面看不到可以输序列号的地方. 因为微软把他隐藏了. 2.我们可以借用工具把他显示出来 下载地址:http://www.zlsoft.com/techbbs ...

  7. android MeasureSpec的三个测量模式

    1.MeasureSpec含义 其实可以去看MeasureSpec的文档,里面对MeasureSpec的作用介绍得很清楚.MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureS ...

  8. Maven部署dao工程到私服上——(十三)

    1.修改settings.xml 需要在客户端即(部署dao工程)的电脑上配置 maven环境,并修改 settings.xml 文件,配置连接私服的用户和密码 . 此用户名和密码用于私服校验,因为私 ...

  9. imperva 更改agent的注册密码

    imperva agent 在注册到网关的时候显示账号密码错误 如下图 这是一个数据库审计的设备由于当初最开始实施的时候并不是我安装的,所以账号密码我也不清楚,客户留的账号密码也不确定.因此导致账号密 ...

  10. python报错IndexError: list index out of range

    今天写个ping vpn的python脚本,报错IndexError: list index out of range 最后查看是python读取文件中出现空格 去掉空格即可