zoukankan      html  css  js  c++  java
  • [USACO2004][poj2373]Dividing the Path(DP+单调队列)

    http://poj.org/problem?id=2373

    题意:一条直线分割成N(<=25000)块田,有一群奶牛会在其固定区域吃草,每1把雨伞可以遮住向左右延伸各AB的区域,一只奶牛吃草区域内不允许有雨伞间隙,即只能被1把雨伞覆盖,求将n块田都覆盖的最少雨伞数。

    分析:

      易写出dp式子,dp[i]表示覆盖[0,i]需要的最少雨伞数量——

          若i不为某一奶牛的领地:dp[i]=min(dp[j])+1,i-2b<=j<=1-2a,且j不属于某一只奶牛的领地

          若i为某一奶牛的领地:dp[i]=inf

    这里面临两个问题:

    1、Q:如何快速处理处牛的领地,即我们如何快速知道哪些点要跳过哪些点要进行dp?

       A:对于读入的Bi和Ei,我们可以A[Bi]=-1,A[Ei+1]=1,从而可以通过前缀和快速判断每个位置是否是奶牛的领地

    2、Q:如何快速的找出i-2b<=j<=i-2a中的最小值

       A:鉴于a,b都是常数,所以这题当然可以用单调队列撸

  • 相关阅读:
    C++---使用类
    C++---函数
    C++---指针和引用
    C++---面向对象
    C++---数组
    C++---条件结构和循环结构
    C++---变量、数据类型和运算符
    C++---初识C++
    MySQL---什么是事务
    MySQL---char和varchar的区别
  • 原文地址:https://www.cnblogs.com/wmrv587/p/3592939.html
Copyright © 2011-2022 走看看