动态规划 Dynamic Programming
动态规划即动态递推,解题步骤如下:
第一步:递归+记忆化=递推
第二步:状态的定义opt[n], dp[n], fib[n]
第三步:状态转移方程 opt[n] = best_of ( opt[n-1] , opt[n-2] )
第四步:最优子结构
斐波那契数列:
1. 传统递归做法:O为2的N次方
int fib2(int n){ return n <= 1 ? n : ( fib(n-1) + fib(n-2) ); }
2. 记忆化,正推==》递归:
int fib3(int n, int[] memo){
memo[0] = 0;
memo[1] = 1;
for (int i = 2; i <= n; i++) {
memo[n] = memo[n-1]+memo[n-2];
}
return memo[n];
}
int fib2(int n){ return n <= 1 ? n : ( fib(n-1) + fib(n-2) ); }
爬楼梯:leetcode 70.Climbing Stairs-爬楼梯
f[n] = f[n-1] + f[n-2]
同上 int fib2(int n){ return n <= 1 ? n : ( fib(n-1) + fib(n-2) ); }