zoukankan      html  css  js  c++  java
  • [luoguP1156]垃圾陷阱

    两天来一直在弄 垃圾陷阱 这道题,

    最开始竟然连dfs也不会写orz ,

    非常急躁地想要去做题,

    最后写出了一个结构和码风都非常差的剪枝dfs。

    数据很水,让我过了7个点

    然后就想着要改成记忆化搜索,

    结果因为不知道怎么处理生命的限制条件而无从下手。

    看到time这个维度可以删去,就删了,然后开三维数组。

    但因为结果有两种情况,

    返回了一种情况又想着怎么弄另一种情况,

    最后这种尝试在调试怎么都不过、返回值不明确的情况下结束

    然后走投无路的我去看了题解,发现这就是道背包dp题…………

    但是这道题比一般的背包dp题多了很多迷惑人的地方

    首先我们可以把这个弥天大坑看做一个背包,
    
    再把扔进去的垃圾的高度看做有价值的物品,
    
    如果只有这些的话那么这就是一个普及-的dp题了!
    
    但是我们发现:
    
    1.垃圾的使用受投入时间和奶牛生命的限制
    
    2.状态除了垃圾个数以外有奶牛生命、时间、达到的高度
    
    

    先试试把垃圾使用的限制条件放一边。

    最优的时间一定是处理最后一个垃圾的时间,

    把垃圾个数作为第一个开数组的状态,

    生命和高度两者任选其一作为存储的值,剩余的作为开数组的状态。

    然后尝试写状态转移方程,再把限制的条件作为转移的限制条件,又遇到了新问题:

    改变的值是从当前垃圾取得还是从上一个垃圾处取得?

    联系dp的一些基本概念,发现是处理当前垃圾的决策是改变状态的因素,

    所以当然是当前垃圾改变状态值。

    迎来了最后一个问题:

    初始值的设置。

    按照题解的讲解写好程序后发现状态转移变成了状态复制,

    一行行不论高度全都是一样的值!?

    开始怀疑是因为找生命的最大值导致当前永远是一有垃圾就吃的值

    然而最后发现是因为初始值设成了在处理了0个垃圾时在任何高度上都有10的生命,

    这等于忽略了高度这一限制条件,

    当然开始就只能在高度0待着,只有高度0有生命10。

    修改后终于过了。

    于是花了4小时水一道实际难度为 普及+/提高 的 题。

  • 相关阅读:
    python CST中国标准时间格式转换
    pytest+报告插件
    getopt实现命令行
    初识Redis
    python list 切片及翻转的使用
    mysql中information_schema表
    获取两个字符串中最长的相同子串
    mongodb数据库备份
    VS2005下边不能使用target>remote tool解决方法
    wince LoadDriver tool
  • 原文地址:https://www.cnblogs.com/StarOnTheWay/p/10541669.html
Copyright © 2011-2022 走看看