bzoj千题计划235:bzoj2448: 挖油
http://www.lydsy.com/JudgeOnline/problem.php?id=2448
一遍过,嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎嘎,O(∩_∩)O~
题意是最小化最大值
设计区间dp
dp[i][j] 表示在能确定x不在区间[i,j]内,或确定x在区间[i,j]内某个位置的最坏情况下的最小值
dp[i][j]=min { max(dp[i][k-1],dp[k+1][j] ) + a[k] } k∈[i,j]
O(n^3)复杂度
#include<cstdio>
#include<cstring>
#include<iostream> using namespace std; #define N 2002 int a[N]; int dp[N][N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
int n;
read(n);
for(int i=;i<=n;++i) read(a[i]);
memset(dp,,sizeof(dp));
for(int i=;i<=n;++i)
dp[i][i]=a[i],dp[i][i-]=;
for(int i=n;i;--i)
for(int j=i;j<=n;++j)
for(int k=i;k<=j;++k)
dp[i][j]=min(dp[i][j],max(dp[i][k-],dp[k+][j])+a[k]);
printf("%d",dp[][n]);
}
优化:
把max去掉,就可以使用单调队列优化了
很显然的结论是长区间的dp值一定>=它的子区间的dp值
当固定i和j时,随着k的递增,dp[i][k-1]单调不降,dp[k+1][j]单调不增
所以一定可以找到一个分界点g,
当k∈[i,g]时,dp[i][k-1]>dp[k+1][j]
当k∈[g+1,j]时,dp[k+1][j]>dp[i][k-1]
所以上述转移方程变为
当k∈[i,g]时,dp[i][j]=min { dp[i][k-1]+a[k] }
当k∈[g+1,j]时,dp[i][j]=min { dp[k+1][j]+a[k] }
用g[i][j]表示对于每对i,j 求出的g
对于 当k∈[i,g[i][j] ]时,dp[i][j]=min { dp[i][k-1]+a[k] }
可以得出结论 g[a][b]<=g[a][b+1]
因为这里是前面的dp值>后面的dp值,[a,b+1]在[a,b]后面加了一个位置,
后面的dp值不变或增大,前面要包含更多的位置使前面变的更大,才能>=后面,所以g的位置不变或后移
所以固定区间左端点,随右端点的右移,g单调不减
对于 当k∈[g[i][j]+1,j]时,dp[i][j]=min { dp[k+1][j]+a[k] }
可以得出结论 g[a-1][b]<=g[a][b]
因为这里是后面的dp值>前面的dp值,[a-1,b]在[a,b]前面加了一个一个位置
前面的dp值不变或增大,后面要包含更多的位置使后面变的更大,才能>=前面,所以g的位置不变或前移
所以固定区间右端点,随左端点的左移,g单调不增
所以可维护n+1个单调队列
一个表示固定左端点,n个表示固定右端点
因为是左端点从n倒序枚举,右端点从左端点正序枚举
所以固定左端点的只需要用一个,左端点改变的时候清空队列即可
但是右端点是跳来跳去的,所以要用n个
实际实现的时候可以不计算g
如果要计算g的话,由上面可以得出结论
g[a-1][b]<=g[a][b]<=g[a][b+1]
利用g的单调性计算g
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 2002 int a[N]; int dp[N][N]; int q[N][N];
int h[N],t[N]; #define A(x) dp[i][(x)-1]+a[(x)]
#define B(x) dp[(x)+1][j]+a[(x)] void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int main()
{
int n;
read(n);
for(int i=;i<=n;++i) read(a[i]);
memset(dp,,sizeof(dp));
for(int i=n;i;--i)
{
dp[i][i]=a[i];
h[]=;
q[][t[]=]=i;
q[i][t[i]=]=i;
for(int j=i+;j<=n;++j)
{
while(h[]<t[] && A(q[][h[]])<B(q[][h[]])) ++h[];
while(h[]<t[] && A(j)<A(q[][t[]-])) --t[];
q[][t[]++]=j;
while(h[j]<t[j] && B(q[j][h[j]])<A(q[j][h[j]])) ++h[j];
while(h[j]<t[j] && B(i)<B(q[j][t[j]-])) --t[j];
q[j][t[j]++]=i;
dp[i][j]=min(A(q[][h[]]),B(q[j][h[j]]));
}
}
printf("%d",dp[][n]);
}
2448: 挖油
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 133 Solved: 57
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
8 24 12 6
Sample Output
HINT
对于100%的数据,n<=2000,ti<=10^6
bzoj千题计划235:bzoj2448: 挖油的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- Flutter - 创建侧滑菜单(不使用navigatior,仅改变content)
之前写过一篇文章,Flutter - 创建横跨所有页面的侧滑菜单.这个里面中使用了Navigator.of(context).push来导航到新的页面. 这次介绍一种不使用导航,仅仅改变content ...
- 「功能笔记」Spacemacs+Evil备忘录
设置代理 (setq url-gateway-method 'socks) (setq socks-server '("Default server" "127.0.0. ...
- java数据结构之hashMap
初学JAVA的时候,就记得有句话两个对象的hashCode相同,不一定equal,但是两个对象equal,hashCode一定相同,当时一直不理解是什么意思,最近在极客时间上学习了课程<数据结构 ...
- Bootstrap 样式设计 栅格系统
.col-xs- 超小屏幕 手机 (<768px) .col-sm- 小屏幕 平板 (≥768px) .col-md- 中等屏幕 桌面显示器 (≥992px) .col-lg- 大屏幕 大桌面显 ...
- CodeMirror 小册子
User manual and reference guide version 5.41.1 用户手册和参考指南 CodeMirror is a code-editor component ...
- .net中操作Visual SourceSafe
最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件visual sourcesafe的一些操作.以下简称vss. 想起以前写的时候,因为资料比较匮乏,只能边研究边测试,走了不少弯路. 由 ...
- 读书笔记(chapter18)
调试 18.1准备开始 18.2内核中的bug 1.从隐藏在源代码中的错误到展现在目击者面前的bug,往往是经历一系列连锁反应的事件才可能触发的 18.3通过打印来调试 1.健壮性 健壮性是print ...
- spring-boot随笔
配置了spring-boot-starter-web的依赖后,会自动添加tomcat和spring mvc的依赖,那么spring boot 会对tomcat和spring mvc进行自动配置 < ...
- 如何用Qt自动拷贝exe依赖的dll
QT生成的.exe文件不能运行的解决办法 之前的数独项目的GUI,当我的Qt项目生成exe时,由于缺少了相关的依赖dll文件,打开会一直报缺少依赖文件的错: 然后一开始我到安装的Qt文件夹里把这些有Q ...
- C++中关键字explicit的作用
C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色. 1 是个构造器 ,2 是个默认且隐含的类型转换操作符. 所以, 有时候在我们写下如 AAA ...