动态规划
动态规划的定义
将原问题拆解成若干子问题,同时保存子问题的答案,使得每个子问题只求解一次,最终获得原问题的答案。
注:很多时候,记忆化搜索过程也是动态规划
问题的引入:斐波拉契数列(Fibonacci Sequence)
F(0)=0, F(1)=1, F(n) = F(n-1) + F(n-2)
// A code block
int fib( int n ){
if (n==0)
return 0
if (n==1)
return 1
return fib(n-1) + fib(n-2)
}
直接利用此函数去求值,计算复杂度将会是2^n,因为中点有很多节点存在重复计算
于是,我们使用一个数组来记录F(n),已经计算过的就不再重复计算,复杂度降为o(n):
// A code block
vector<int> memo;
//记忆化搜索,自顶向下
memo = vector<int>(n+1, -1)
int fib( int n ){
if (n==0)
return 0
if (n==1)
return 1
if memo[n]==-1
memo[n] = fib(n-1) + fib(n-2)
return memo[n]
}
或者使用动态规划, 自底向上:
// A code block
vector<int> memo;
//动态规划,自底向上
memo = vector<int>(n+1, -1)
int fib( int n ){
memo[0] = 0;
memo[1] = 1;
for(int i =2 , i<n, i++)
memo[n] = memo[n-1] + memo[n-2];
return memo[n]