废话:
我是个小小小小菜鸟~~想要飞吖飞也飞不高~~~~~~~~
所以这篇文章暂时不值得看~~或许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 第一维用二进制方式来运算..表示当前状态.. 第二维表示当前状态..
其中有个小小的技巧就是滚动数组.. 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~~~~~~~以后再见..