一、斜率优化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. 在CentOS上导出JVM内存信息

    首先看下Tomcat的进程Id: [root@iZ25Z ~]# ps aux | grep java www 2111 4.0 23.5 1637648 452756 ? Sl 10:12 4:35 ...

  2. 使用 git 托管代码

    1. 下载安装好 git 客户端 2. 找一个家代码托管平台 我用 coding.net,注册个账号,建一个空项目 然后打开安装好的 git bash 客户端,使用 git clone 命令克隆下远程 ...

  3. 你真的理解js的赋值语句么

    之前谢亮兄和我一起讨论的一个问题: var a = {}; a.x = a = 3; a 的值是什么. 其实当执行赋值语句的时候,js 的 = 左侧不是原始变量地址,而是一个新值.怎么理解这句话呢? ...

  4. [原]Android开发优化-Adapter优化

    ListView作为Android开发中使用频率最高的一个控件,保证ListView的流畅运行,对用户体验的提高至关重要.Adapter是ListView和数据源之间的中间人,当每条数据进入可见区时, ...

  5. HDU 1869 六度分离 最短路

    解题报告: 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人, ...

  6. HDU 2093 考试排名 模拟题

    解题报告: 题目描述:写一个程序给一个编程考试C++实时提交系统排名,给你的数据是题目的总数,每次错误提交罚的时间分,每位用户的姓名,然后是输入用户每题的完成情况,有一下几种情况,第一,输入只有一个正 ...

  7. C# 常用控件属性及方法介绍

      C#常用控件属性及方法介绍                                               目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox ...

  8. Ubuntu接显示器问题

    1.Could not apply the stored configuration for monitors 解决办法:Ubuntu在开机进入桌面的时候,会调用gnome-setting-deamo ...

  9. 运动规划——PT and PVT 模式

    最近项目成员在做机器人上层开发时,经常说到PT模式和PVT模式.一直没搞懂这两种模式的实际差别.上网检索进行学习...... ref link:https://blog.csdn.net/m0_376 ...

  10. 【linux kernel】 中断处理-中断下半部【转】

    转自:http://www.cnblogs.com/embedded-tzp/p/4453987.html 欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地 ...