动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素解法。
动态规划有自底向上和自顶向下两种解决问题的方式。自顶向下即记忆化递归,自底向上就是递推。
使用动态规划解决的问题有个明显的特点,一旦一个子问题的求解得到结果,以后的计算过程就不会修改它,这样的特点叫做无后效性,求解问题的过程形成了一张有向无环图。动态规划只解决每个子问题一次,具有天然剪枝的功能,从而减少计算量。
1. 爬楼梯
class Solution {
public:
int climbStairs(int n) {
//找到了规律1,2,3,5,8......
if(n==1){
return 1;
}
if(n==2){
return 2;
}
int a=1,b=2;
int ans=0;
for(int i=3;i<=n;i++){
ans = a+b;
a=b;
b=ans;
}
return ans;
}
};
具体问题具体分析,解决了就行,不一定非得要用递归。