在诸多算法中,我认为动态规划是其中上下限差距最大,也是最有魅力的一种算法,可以很难,很精妙,如鸡蛋掉落;也可以很简单,如斐波那契数列;也可以很经典,如LIS,LCS;也可以很复杂,如数字0-9的数量等等。
针对于动态规划,经过一段时间的刷题做个简单的总结。
动态规划的关键是状态及转移,而核心则为无后效性,如果有后效性则无法使用动态规划求解。
第一步是进行分析,将题目中隐晦的逻辑进行简化或者转化,这点可以说是经验与知识的积累;
第二步则是抽取出题目提到的状态,比如股票买卖系列中的,每天的收益,这里天,收益都是状态;
第三步则是抽取出题目提到的动作,动作就是状态转移,比如股票买卖系列里的卖出和买入就是两个转移动作。经过以上三步后,进而需要根据状态来定义初态,结果怎么取。
ps:
1、状态的定义一般都是定义某个子问题的最优解,比如某个子区间的最大值。
2、初态的初始化可以结合状态的转移,保证状态转移的时候,前置状态一定都是已知的。
最后还是要经过大量的实践练习来积累经验,没见过的解法是很难凭空想到的。