zoukankan      html  css  js  c++  java
  • uva-1427 Parade (单调队列优化dp)


    本文出自   http://blog.csdn.net/shuangde800


    题目链接:  uva-1427   hdu-2490   poj-3923

    题意

    F城由n+1个横向路和m+1个竖向路组成。你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值和最大(注意,一段路上的高兴值可以是负数)。同一段路不能经过两次,且不能从北往南走。另外,在每条横向路上所花的时间不能超过k


    思路

    这题在uva和LA上又是不能评测, 于是在hdu和poj上评测了这题

    这题状态比较容易想到, f(i, j)表示走到第i行第j点的最大价值
    对于每一点,可以从下一行的走上来,也可以从左边走过来,也可以从右边走过来
    设L(i, j)表示第i行从左边走到j点的最大价值,R(i, j)表示第i行从右边走过来的最大价值
    可以得到, f(i, j) = max{ L(i,j), R(i, j), f(i+1, j) }
    关键是要求L(i, j)和R(i, j)

    sum(i, j)表示第i行的前j个路段价值之和
    L(i, j) = max{ f(i+1, k) + sum(i, j) - sum(i, k) | 1<=k<=j && k走到j的总时间 <= k}
    转换可以变成:
    L(i, j) = max{ f(i+1, k) - sum(i, k)| 1<=k<=j && k走到j的总时间 <= k}  + sum(i, j)

    所以只要维护一个k,使得
    f(i+1, k) - sum(i, k)的值最大,这可以用单调队列来维护这个值

    求R(i, j)的方法也可L一样



    代码

     
  • 相关阅读:
    回老家
    防疫针
    平安夜
    虎威威
    圣诞联欢会
    小老虎飞船
    电子积木
    打印
    周日大悦城
    又一年毕业季
  • 原文地址:https://www.cnblogs.com/bbsno1/p/3266602.html
Copyright © 2011-2022 走看看