DP总结..未完待续

废话:

我是个小小小小菜鸟~~想要飞吖飞也飞不高~~~~~~~~


所以这篇文章暂时不值得看~~或许1年后会变得有看的价值了~~~


前一阶段都在练习DP..DP是一个大坑吖~~特别是动态转移方程..实在不好推..需要多做题多总结..


正文:

我感觉..DP题主要确定3个要素..

初始状态,动态转移方程和末状态..


而最最开始要确定的是对这个动态转移方程..该定义几维..每一维又代表什么..

教主大人语录:<DP方程是解决看上去要暴力的东西>

*******************解决动态规划问题的时候,一般都是从尽量简单的状态表示入手

*******************比如从一维状态入手

*******************看能不能具有最优子结构

*******************并进行状态转移

*******************否则就增加维度

*******************其实就是增加要枚举的状态的数目

*******************直到发现问题可以解决为止

*******************把问题的规模缩小,每个子树看成一个子问题

*******************由小问题解决大问题~~

*******************最终把整个看成一个树就可以解决了

*******************至于这个状态转移怎么想到,其实就是在考虑各种可能的状态

*******************基本上状态表示靠谱的话,状态转移就是一下子就能想到


个人还没完全参透究竟怎么推DP方程~所以还需要多多练习..

总而言之就是从简单的入手..然后根据需要增加维度..


                           *******************************************************************华丽丽的分割线*************************************************************


我暂时遇到3种DP..

普通的DP..譬如最长公共子序列..最长单调自序列 and so on~

树形DP.. 树形DP感觉有两种..dp[ 节点编号 ][ ]  第二维我暂时做过的有两个表示状态..一个是最有子节点编号..一个是用0 1 代表最优解不包含该节点 / 包含该节点  

                              POJ 1192 最优连通图   HLG 1329 游乐园     HLG 1474 <简单>     HLG 1477 <简单> 

状态压缩.. 二维dp 第一维用二进制方式来运算..表示当前状态.. 第二维表示当前状态..

                              HLG 1473 <简单>


           其中有个小小的技巧就是滚动数组..   POJ 1745 加减乘除

                       就是第一维可以表示成 0 1 两种状态..dp[ 1 ][ ] = max或min( dp[ 0 ][ state ] ) 确定..

           这可以解决memory太大的问题.. 挺有用的一个技巧


                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~未完成分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


感觉DP都是用维数表示状态..然后用值表示最优解..

从最底层已知状态开始往上推..一层一层推出最优解..直到顶端..

所以在推最优解的过程中就用 min max 等判断采取的当前最优解..


还有就是因为通常都是用维数来表示状态..

所以如果给的状态有负值就需要 定义一个平衡值..用平衡值来解决问题..eg :  POJ 1837 天平  POJ 1015 审判团


然后背包九讲吖~一定要抽空认真拜读..是经典的作品~~


                          ^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^我的遇到的问题总结分割线_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^


我做DP问题的时候主要那3个问题是必须不会的问题..


还有就是做树形DP的时候不会建树..这个问题很让人纠结.. 

总结了2个方法建树.. vector [ 就是邻接矩阵 了]:POJ 1192 最优连通图    HLG 1474 <简单>     HLG 1477 <简单>  

                                          就是用二维  vector  第一维表示节点编号..第二维表示子节点编号..

                                          读入的时候就用一个visited标记..就可以在读完输入数据后用一层for循环来找到根节点..然后从根节点对树进行DP  输出结果通常也是根节点的值..

                                     然后是 邻接链表来存..  但是比较麻烦..

                                                 建树可以用 floyd.. 

差不多也就这样了..


下一个旅程是图论~~~我的最爱吖~~~~~虽然不怎么好~~~DP    88888888888~~~~~~~以后再见..


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值