【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. 通知的多线程问题 iOS

    发送通知在子线程,接受也在子线程.如果子线程操作UI,会打印一推日志,告诉我们应该主线程操作.

  2. Maven学习(十二)-----Maven POM

    Maven POM POM代表项目对象模型.它是 Maven 中工作的基本单位,这是一个 XML 文件.它始终保存在该项目基本目录中的 pom.xml 文件.POM 包含的项目是使用 Maven 来构 ...

  3. OpenCL入门:(三:GPU内存结构和性能优化)

    如果我们需要优化kernel程序,我们必须知道一些GPU的底层知识,本文简单介绍一下GPU内存相关和线程调度知识,并且用一个小示例演示如何简单根据内存结构优化. 一.GPU总线寻址和合并内存访问 假设 ...

  4. LUIS 语义识别API调用方法

    本例使用itchat获取微信文字消息,发送给LUIS返回识别消息,再将返回消息格式化后通过微信发回 关于itchat的使用参考我的另外一篇随笔itchat个人练习 语音与文本图灵测试例程 # -*- ...

  5. oss上传文件0字节

    最近使用oss上传文件,不同项目中使用的版本也不同,之前的都能正常上传,最近因需要添加ObjectMetaData属性,扩展了一个方法,发现上传的文件始终是0字节的,最终跟源码发现conntentLe ...

  6. Mac下布置appium环境

    1.下载或者更新Homebrew:homebrew官网 macOS 不可或缺的套件管理器 $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githu ...

  7. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  8. spark重点知识

    1 scala 2 spark rdd 3 sprak core 4 性能优化 5 spark sql 6 spark streaming 掌握程度-精通的理解:

  9. python购物车优化

    一.需求分析 拥有用户接口和商家接口 用户能够进行消费记录查询,充值,购物等功能,消费记录存储于数据库 商家可以进行商品的增删改等操作 二.程序流程图 程序大致流程图如下: 三.代码实现 本程序分成两 ...

  10. Redis 指令

    一个key可以存放将近40亿条数据 选择库    select 2  (代表选择第三个库) 增加key  set db_number  11 删除key  del key 获取值   get db_n ...