BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2442
题意:
有n个数a[i]从左到右排成一排。
你可以任意选数,但是连续的数不能超过k个。
问你最大的选数之和。
题解:
表示状态:
dp[i]表示考虑了第i个数的最大之和。
找出答案:
ans = dp[n]
将所有的数都考虑过了
如何转移:
对于a[i],要么选,要么不选。
(1)如果不选,则dp[i] = max dp[i-1]。
(2)如果选,则最多往前选k个数,且在i-k的位置一定不能选。
所以:
dp[i] = max dp[j] + sum(j+2,i) (i-k-1 <= j <= i-2)
变成前缀和的形式:
dp[i] = max dp[j] + sum[i] - sum[j+1]
也就是:
dp[i] = max(dp[j] - sum[j+1]) + sum[i]
对于dp[j] - sum[j+1]这一部分,可以用单调队列优化。
边界条件:
dp[0] = 0
q[head++] = Node(-1,0)
-1为假想的位置,只是为了在n == 1的时候能够用到0这个值。
AC Code:
// state expression:
// dp[i] = max efficiency
// i: selected ith cow
//
// find the answer:
// max dp[n]
//
// transferring:
// dp[i] = max(dp[j] + sum(j+2,i), dp[i-1])
// dp[i] = max(dp[j] + sum[i] - sum[j+1], dp[i-1])
// dp[i] = max(dp[j] - sum[j+1] + sum[i], dp[i-1])
// i-k-1 <= j <= i-2
//
// boundary:
// dp[0] = 0
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 100005 using namespace std; struct Node
{
int idx;
long long val;
Node(int _idx,long long _val)
{
idx=_idx;
val=_val;
}
Node(){}
}; int n,k;
int head=;
int tail=;
int e[MAX_N];
long long dp[MAX_N];
long long sum[MAX_N];
Node q[MAX_N]; void read()
{
cin>>n>>k;
sum[]=;
for(int i=;i<=n;i++)
{
cin>>e[i];
sum[i]=sum[i-]+e[i];
}
} void solve()
{
dp[]=;
q[tail++]=Node(-,);
for(int i=;i<=n;i++)
{
if(i>=)
{
while(head<tail && q[tail-].val<dp[i-]-sum[i-]) tail--;
q[tail++]=Node(i-,dp[i-]-sum[i-]);
}
while(head<tail && q[head].idx<i-k-) head++;
dp[i]=max(q[head].val+sum[i],dp[i-]);
}
} void print()
{
cout<<dp[n]<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp的更多相关文章
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1159 Solved: 593[Submit] ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...
- 修剪草坪 单调队列优化dp BZOJ2442
题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Farm John的草坪非 ...
- P2627 修剪草坪 (单调队列优化$dp$)
题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...
- bzoj2442[Usaco2011 Open]修剪草坪——单调队列优化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2442 考虑记录前 i 个.末尾 j 个连续选上的最大值.发现时空会爆. 又发现大量的转移形如 ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...
- ●BZOJ 2442 [Usaco2011 Open]修剪草坪
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题解: 单调队列优化DP 把问题转化为:从序列里选出一些相邻之间间隔不超过K的数,使得 ...
- BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP
先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪
Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠.然而,FJ的草坪非常脏乱,因此,FJ只能够让他的 ...
随机推荐
- java调试工具jdb
Finds and fixes bugs in Java platform programs. Synopsis jdb [options] [classname] [arguments] optio ...
- vue 中 this.$router.push() 路由跳转传参 及 参数接收的方法
传递参数的方法:1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效.需要用name ...
- Shell脚本之:变量
与编译型语言不同,shell脚本是一种解释型语言. 执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code), ...
- UNP学习笔记(第二十五章 信号驱动式I/O)
信号驱动式I/O是指进程预先告知内核,使得当某个描述符发生某事时,内核使用信号通知相关进程. 套接字的信号驱动式I/O 针对一个套接字使用信号驱动式I/O(SIGIO)要求进程执行以下3个步骤: 1. ...
- 转:static关键字的总结
static关键字的总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...
- Error executing DDL via JDBC Statement
© 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 启动hibernate测试案例时报错如下: org.hibernate.tool.schema.spi.CommandAcceptan ...
- scikit-learn(project中用的相对较多的模型介绍):2.3. Clustering(可用于特征的无监督降维)
參考:http://scikit-learn.org/stable/modules/clustering.html 在实际项目中,我们真的非常少用到那些简单的模型,比方LR.kNN.NB等.尽管经典, ...
- 49 个jquery代码经典片段
49 个jquery代码经典片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一 些则是真正有用的函数或方法,他们能够帮助你又快又 ...
- Spark源码分析之八:Task运行(二)
在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...
- Silverlight 5 Grid组的MouseLeave响应
用Silverlight 5作个用户控件,即是用Grid画几个格子.分别显示几张透明图片.效果是显示中间那张,点击显示的图片后将其他几张图片一起显示出来,鼠标立马这个用户控件范围后自己主动隐藏点击后显 ...