参考
https://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92
https://juejin.im/post/5a29d52cf265da43333e4da7
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题[1]和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
按照上面作者说的,动态规划需要三个结构:最优子结构,边界,状态转移。
也就是碰到一个问题需要解决 ,如果这个问题可以用更简单一点的问题解决,并且以此递归,不断的削减问题复杂度,直到碰到一个很简单的,可以直接解出来的问题,求出解,再一次次递归跳出,直到最后得到答案。这个与数学的归纳法类似。
有一个楼梯,一共10个台阶,每次可以上1个或是2个,求有多少种走法。
这是上面给出的一个问题。
穷举法的话就是第一步,我们可以上1个或是2个,下一步可以上1个或是2个,一次类推,直到下一次可以直接到10,那么这就是一种解法,如果不能到10,就不是,把可以的解法累加起来就是总的方法。
动态规划的话,就是先找有什么规律。比如当前是第n阶,我们可以用前面已经知道的信息获得当前的信息吗?比如我们在第1阶,那么有几种呢方法?只有一种,上1个台阶。如果是第2阶呢?有2种,连上2次1个台阶或者上1个2个台阶。如果是3个台阶呢?有3种,111,12,21;这个与前面的第1台阶和第2台阶有关系吗?我们发现,上第3台阶,要么是从第1台阶上来,要么是从第2台阶上来。知道第1第2台阶有几种方法,相加,就是第3台阶的方法。f(n)=f(n-1)+f(n-2),这就是这道题的推导公式。
int main() { int allret[10] = { 0 }; for (int i = 0; i < 10; i++) { if (i == 0) { allret[i] = 1; } else if (i == 1) { allret[i] = 2; } else { allret[i] = allret[i - 1] + allret[i - 2]; } } char inchar; cin >> inchar; }