三、动态规划
-
动规做题步骤
- 状态定义,即定义dp[i]表示什么意思
- 转移方程,思考dp[i]与dp[i-1]之间有什么关系,写出转移方程
- 初始状态,特殊值dp[0],dp[1]
- 返回值,dp[n]
- 动态规划是从0,1一直往n开始推的,所以一般是有for循环的
- 动规的dp数组一般可以压缩,因此空间复杂度可以从O(n)降到O(1)
- 一般题目中有,最后一步,子问题,通常都要用到动规
-
剑指10,斐波那契
//时间O(n),空间O(1) //经典问题,斐波那契,使用递归会超时,严格遵循动规操作步骤来 class Solution { public: int fib(int n) { if(n <= 1) return n; int num = 1e9+7; int a = 1; int b = 0; int sum; //递推次数 for(int i=0;i<n-1;++i) { sum = (a + b) % num; b = a; a = sum; } return sum; } };
-
剑指10,青蛙跳台阶
//时间O(n),空间O(1) //经典问题,同上一道斐波那契,严格遵循动规操作步骤来 class Solution { public: int numWays(int n) { if(n <= 1) return 1; int num = 1e9+7; int a = 1; int b = 1; int sum; //递推次数 for(int i=0;i<n-1;++i) { sum = (a + b) % num;