zoukankan      html  css  js  c++  java
  • 2018.8.17 2018暑假集训 关于dp的一些感想(以目前的知识水平)

    学了这么长时间的dp似乎还是不怎么样

    谨以此篇文字记录一年以来与dp斗智斗勇的各种经历


    关于dp(也就是动态规划)似乎对于每个OIer来说都是一个永远的噩梦。

    刚刚开始学dp的时候完全搞不明白(只是觉得好厉害的样子) 完全停留在刚刚好能够看懂转移方程的阶段

    事实上dp这个东西和其他任何算法都不太一样,同样是仅仅看不可能学会,但是更加可恶的一点是,你仅仅是看,不仅学不会,而且基本上什么东西都学不来。

    说到底,毕竟哪个题都不一样,基本上不可能考到同样的题同样的转移方程(可惜当时并不明白这个道理)。

    于是甚至在之后的几个月,对于每个和dp有关系的题,基本上都是看题解——想一想——就交了。。。。。。

    导致在这半年中,不管其他算法,我的dp可以说没有半点大的进展。


    直到我终于下定决心在洛谷上刷了三四十道dp之后。

    所谓刷了三四十道dp,不过是在看了题解之前多想了两三个小时而已(大家千万不要学我Q_Q)

    尽管如此,仍然是量变导致质变,总算明白了一点dp究竟是啥


    所谓dp这个东西,其实就是状态的表示、初始化以及从一个状态向另一个状态的转移(废话)

    关于书上写的那个无后效性 其实就是判断能不能用dp做‘

    有很多人曾经问过我和我们一些同学dp究竟是啥,说的通俗一点,其实就是一个每个点只搜了一次的搜索,只不过搜索的顺序比较玄学,所以扯到了各种各样的状态之类的东西。

    对于本人现在的水平 重点就是状态的划分

    比如说01背包 就是对于每个物品的装和不装的枚举,再比如说摆花,就是对于每盆花摆在哪里的枚举。(其实很多题都可以经过多次推导变化成这两个题,以后会再提)

    很多时候会想,dp的数组究竟应该怎么开,开几维才能不TLE以及MLE

    后来总算想起来一个方法,就是枚举变量


    对于我们这种水平的蒟蒻来讲,一般求什么dp的结果就是什么 这是一个变量

    为了方便起见,我们把题目中可视的或者较为明显的称为一阶变量,需要经过一阶变量推出的称为二阶变量,同样的可以推出n阶变量,其中包括结果在内的任何一个变量都可以是一到n阶变量(只要你用得比较熟练这个方法应该可以一直用下去)

    假设我们已经根据题面初步计算出了在不会TLE及MLE的情况下最多几维dp

    这样我们在选取变量作为参数的过程中就可以根据位置的个数选取不同阶数的变量进行状态的表示了


    关于对状态的初始化

    其实重点就是在可以手算或者心算的边界条件中选取必要的作为初始化的结果

    当然还有 例如对每个状态初始值的设定用来判断状态是否有效或者对累加的设置等


    关于对状态的转移

    刚才已经提到过了状态的划分,其实状态的转移就是从前一个状态转移到后一个状态

    通常情况下,对于转移方程来讲,主体一定是对当前状态的操作

    例如01背包的二维转移方程 dp[i][v]=max(dp[i-1][v],dp[i-1][j-w[i]]+c[i])其实就是对第i件物品“取与不取”的操作


    最后再注意一下循环的顺序以及方向等细节就可以了


    上述这些文字,作为一年中与dp斗智斗勇的一部分经历,也算是OI生涯中的一部分吧。

    /*====年轻人,瞎搞是出不了省一的,这就是现实====*/
  • 相关阅读:
    MySQL 查询树结构、循环查询、查看函数、视图、存储过程
    SpringBoot 部署:外置依赖包
    springboot集成docker实现自动化构建镜像说明
    Chrome谷歌浏览器常用快捷键、开发技巧
    Windows常用CMD命令
    Git 版本管理,与 SVN区别对比
    TensorFlow重新导入restore报错: OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key Variable not found in checkpoint
    MySQL字符集设置
    Hive 时间操作
    深度思考:如何规划你的职业生涯
  • 原文地址:https://www.cnblogs.com/qxds/p/9492074.html
Copyright © 2011-2022 走看看