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

给出一条线段,在左端点点0与右端点n+1间有n个点(n<=2000),并且在0到x之间的所有点都是有油的,在每个点钻井判断是否有油需要时间ti,求能够知道x的最坏情况下最少需要多少时间。
 

Input

第一行包含一个数n,如题目描述。
第二行包含n个数,表示在第i个点钻井判断是否有油需要的时间。
 

Output

输出包含一行,最坏情况下最少需要多少时间。
 

Sample Input

4
8 24 12 6

Sample Output

42

HINT

对于100%的数据,n<=2000,ti<=10^6

bzoj千题计划235:bzoj2448: 挖油的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. 互联网寒冬,Python 程序员如何准备面试

    虽说年年都在喊互联网寒冬,最难就业季,但是今年确实有点不一样,年前年后一波又一波互联网公司宣布『人员调整,结构优化』, 这是往年没发生过的. 是不是面试机会就少了很多呢?不是的. 搜索招聘网站我们可以 ...

  2. PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789810.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  3. Notes of Daily Scrum Meeting(11.12)

    今天我们召开了Beta阶段MOOC项目开发的第一次Scrum Meeting,在会上就alpha阶段进行了总结,然后我们确定了 接下来的Beta阶段的项目分工,并且就每天的进度汇报做了一个约定,就是每 ...

  4. Hadoop 5 Hbase 遇到的问题

    hbase伪分布式配置完成后: 在bin/hbase shell 进行create操作时出现:Can't get master address from ZooKeeper; znode data = ...

  5. week4

    History:Commercialization and Growth course Explosive Growth of the Internet and Web The Year of the ...

  6. RocketMQ 事务消息

    RocketMQ 事务消息在实现上充分利用了 RocketMQ 本身机制,在实现零依赖的基础上,同样实现了高性能.可扩展.全异步等一系列特性. 在具体实现上,RocketMQ 通过使用 Half To ...

  7. Hibernate性能优化之EHCache缓存

    像Hibernate这种ORM框架,相较于JDBC操作,需要有更复杂的机制来实现映射.对象状态管理等,因此在性能和效率上有一定的损耗. 在保证避免映射产生低效的SQL操作外,缓存是提升Hibernat ...

  8. Entity Framework(EF) Code First将实体中的string属性映射成text类型的几种方式

    1.通过ColumnType属性设置 [Column(TypeName="text")] public string Text { get; set; } 在进行以上属性设置时,请 ...

  9. BZOJ4520 CQOI2016K远点对(KD-Tree+堆)

    堆维护第k大,每个点KD-Tree上A*式查询较远点,跑得飞快,复杂度玄学. #include<iostream> #include<cstdio> #include<c ...

  10. group replication && Galera replication

    不愧是 Oracle 的 MySQL Community Manager,把对手的 Galera Cluster 讲得一无是处. http://lefred.be/content/group-repl ...