• [luoguP1156]垃圾陷阱


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

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

    非常急躁地想要去做题,

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

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

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

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

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

    但因为结果有两种情况,

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

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

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

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

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

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

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

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

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

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

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

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

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

    迎来了最后一个问题:

    初始值的设置。

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

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

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

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

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

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

    修改后终于过了。

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

  • 相关阅读:
    Java实现连接FTP服务并传递文件
    消息队列(MQ)入门-activemq,rocketmq代码级别
    js分页功能实现
    记录几个遇到的问题和解决方法
    oracle 日志归档设置
    打印系统时间
    linux 定时任务
    linux 安装jdk
    db2 命令
    二维码、条形码扫描——使用Google ZXing
  • 原文地址:https://www.cnblogs.com/StarOnTheWay/p/10541669.html
Copyright © 2020-2023  润新知