【BZOJ3156】防御准备(动态规划,斜率优化)

题面

BZOJ

题解

从右往左好烦啊,直接\(reverse\)一下再看题。

设\(f[i]\)表示第\(i\)个位置强制建立检查站时,前面都满足条件的最小代价

\(f[i]=min(f[j]+sum[i-j-1])+A[i]\)

即枚举上一个检查站建立的位置。

假设存在\(k,j\)满足\(k<j\),并且\(j\)的转移优于\(k\)的转移。

那么\(f[j]+sum[i-j-1]<f[k]+sum[i-k-1]\)

因为\(sum\)这个和\(i,j,k\)有关,所以把它拆分一下,变成之与\(i\)以及只与\(j\)相关的式子

\(sum[i-j-1]=\sum_{k=1}^{i-j-1}k=sum[i-1]-sum[j]-(i-j-1)*j\)

然后再放回到上面的不等式。

即\(f[j]-sum[j]-(i-j-1)*j\lt f[k]-sum[k]-(i-k-1)*k\)

按照是否和\(i\)有关对于式子分类

\((f[j]-sum[j]+j^2+j)-(f[k]-sum[k]+k^2+k)\lt (j-k)*i\)

令\(g[i]=f[i]-sum[i]+i^2+i\)

直接除过去

\[i\gt \frac{g[j]-g[k]}{j-k}
\]

因为\(i\)单增,所以可以利用单调队列来完成斜率优化。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 1111111
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
ll f[MAX],s[MAX];
int n,a[MAX];
int Q[MAX],h,t;
double Slope(int i,int j){return ((f[i]-s[i]+1.0*i*i+i)-(f[j]-s[j]+1.0*j*j+j))/(i-j);}
int main()
{
n=read();
for(int i=1;i<=n;++i)a[i]=read();
reverse(&a[1],&a[n+1]);
for(int i=1;i<=n;++i)s[i]=s[i-1]+i;
/*
for(int i=2;i<=n;++i)
for(int j=1;j<i;++j)
f[i]=min(f[i],f[j]+s[i-1]-s[j]-j*(i-j-1)+a[i]);
*/
Q[h=t=1]=1;f[1]=a[1];
for(int i=2;i<=n;++i)
{
while(h<t&&Slope(Q[h],Q[h+1])<=i)++h;
int j=Q[h];f[i]=f[j]+s[i-1]-s[j]-j*(i-j-1)+a[i];
while(h<t&&Slope(Q[t],Q[t-1])>=Slope(Q[t-1],i))--t;
Q[++t]=i;
}
for(int i=1;i<=n;++i)f[n]=min(f[n],f[i]+s[n-i]);
printf("%lld\n",f[n]);
return 0;
}

【BZOJ3156】防御准备(动态规划,斜率优化)的更多相关文章

  1. BZOJ3156 防御准备 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8688187.html 题目传送门 - BZOJ3156 题意 长为$n$的序列$A$划分,设某一段为$[i,j] ...

  2. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  3. 2018.09.29 bzoj3156: 防御准备(斜率优化dp)

    传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[i ...

  4. BZOJ3156: 防御准备 【斜率优化dp】

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 2207  Solved: 933 [Submit][Status][Discu ...

  5. bzoj3156 防御准备(斜率优化)

    Time Limit: 10 Sec  Memory Limit: 512 MB Input 第一行为一个整数N表示战线的总长度. 第二行N个整数,第i个整数表示在位置i放置守卫塔的花费Ai. Out ...

  6. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  7. BZOJ3156 防御准备(动态规划+斜率优化)

    设f[i]为在i放置守卫塔时1~i的最小花费.那么显然f[i]=min(f[j]+(i-j)*(i-j-1)/2)+a[i]. 显然这是个斜率优化入门题.将不与i.j同时相关的提出,得f[i]=min ...

  8. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 951  Solved: 446[Submit][Status][Discuss] ...

  9. [bzoj1911][Apio2010特别行动队] (动态规划+斜率优化)

    Description Input Output Sample Input - - Sample Output HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[ ...

  10. [bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)

    Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...

随机推荐

  1. 【Windows定时关机】windows实现定时关机与取消

    背景:本人昨晚本来打算将电脑设置为晚上12点 30定时关机,结果写成了:12:30,所以就在刚才,我正玩游戏的时候, 电脑弹出提示:“windows将在一分钟内关闭”,我刚开始一脸懵逼,后来打开昨天敲 ...

  2. Mac 必备工具之 brew

    brew 是 Mac 下的一个包管理工具,类似于 centos 下的 yum,可以很方便地进行安装/卸载/更新各种软件包,例如:nodejs, elasticsearch, kibana, mysql ...

  3. C# 合并多个结构相同的DataTable

    public DataTable GetAllDataTable(DataSet ds) { DataTable newDataTable = ds.Tables[0].Clone(); //创建新表 ...

  4. 动态权限<一>基本介绍

    android 6.0以上为了保护用户的隐私,和以往被人诟病的权限机制,确立了新的权限机制.从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授 ...

  5. selenium自动化之js处理滚动条和元素聚焦

    selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当我们页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接操作的,会报元素不可见异常的.这时候需要借助滚动 ...

  6. 【Jmeter测试】如何使用BeanShell断言判断请求返回的Json相应结果

      脚本结构​上图中,queryMaterialApiDTOListByPkIds是返回Json格式响应结果的请求,然后添加BeanShell断言详细判断Json结果中的值是否正确. Json格式的相 ...

  7. Centos下安装并设置nginx开机自启动

    一.在centos环境下安装下载并安装nginx,由于nginx需要依赖一些环境才能安装,主要依赖g++.gcc.openssl-devel.pcre-devel和zlib-devel这些环境,首先得 ...

  8. 1.6 JAVA高并发之线程池

    一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...

  9. Nginx快速入门

    本文主要介绍nginx的基本配置和操作,并介绍了一些可以完成的简单任务. 假设您已经学习过并已经安装好了nginx服务器. 如果没有,请参阅安装nginx页面(http://www.yiibai.co ...

  10. Material Safety Data Sheet,MSDS - 化学品安全说明书

    化学品安全说明书(Material Safety Data Sheet)MSDS,国际上称作化学品安全信息卡,是化学品生产商和经销商按法律要求必须提供的化学品理化特性(如PH值,闪点,易燃度,反应活性 ...