题目链接: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的更多相关文章

  1. bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1159  Solved: 593[Submit] ...

  2. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列

    Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  3. 修剪草坪 单调队列优化dp BZOJ2442

    题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Farm John的草坪非 ...

  4. 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][ ...

  5. bzoj2442[Usaco2011 Open]修剪草坪——单调队列优化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2442 考虑记录前 i 个.末尾 j 个连续选上的最大值.发现时空会爆. 又发现大量的转移形如 ...

  6. BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )

    dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...

  7. ●BZOJ 2442 [Usaco2011 Open]修剪草坪

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题解: 单调队列优化DP 把问题转化为:从序列里选出一些相邻之间间隔不超过K的数,使得 ...

  8. BZOJ 2806 [Ctsc2012]Cheat ——后缀自动机 单调队列优化DP

    先建出广义后缀自动机. 然后跑出文章中每一个位置的最大匹配距离. 然后定义$f[i]$表示匹配到以$i$结尾的串时,最长的匹配距离. 显然可以二分$L$的取值. 然后容易得到$DP$方程 $f[i]= ...

  9. BZOJ 2442: [Usaco2011 Open]修剪草坪

    Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠.然而,FJ的草坪非常脏乱,因此,FJ只能够让他的 ...

随机推荐

  1. java调试工具jdb

    Finds and fixes bugs in Java platform programs. Synopsis jdb [options] [classname] [arguments] optio ...

  2. vue 中 this.$router.push() 路由跳转传参 及 参数接收的方法

    传递参数的方法:1.Params 由于动态路由也是传递params的,所以在 this.$router.push() 方法中 path不能和params一起使用,否则params将无效.需要用name ...

  3. Shell脚本之:变量

    与编译型语言不同,shell脚本是一种解释型语言. 执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code), ...

  4. UNP学习笔记(第二十五章 信号驱动式I/O)

    信号驱动式I/O是指进程预先告知内核,使得当某个描述符发生某事时,内核使用信号通知相关进程. 套接字的信号驱动式I/O 针对一个套接字使用信号驱动式I/O(SIGIO)要求进程执行以下3个步骤: 1. ...

  5. 转:static关键字的总结

    static关键字的总结 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用. ...

  6. Error executing DDL via JDBC Statement

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 启动hibernate测试案例时报错如下: org.hibernate.tool.schema.spi.CommandAcceptan ...

  7. scikit-learn(project中用的相对较多的模型介绍):2.3. Clustering(可用于特征的无监督降维)

    參考:http://scikit-learn.org/stable/modules/clustering.html 在实际项目中,我们真的非常少用到那些简单的模型,比方LR.kNN.NB等.尽管经典, ...

  8. 49 个jquery代码经典片段

    49 个jquery代码经典片段,这些代码能够给你的javascript项目提供帮助.其中的一些代码段是从jQuery1.4.2才开始支持的做法,另一 些则是真正有用的函数或方法,他们能够帮助你又快又 ...

  9. Spark源码分析之八:Task运行(二)

    在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...

  10. Silverlight 5 Grid组的MouseLeave响应

    用Silverlight 5作个用户控件,即是用Grid画几个格子.分别显示几张透明图片.效果是显示中间那张,点击显示的图片后将其他几张图片一起显示出来,鼠标立马这个用户控件范围后自己主动隐藏点击后显 ...