1,动态规划
将原问题拆解成若干子问题,并保存子问题的答案,使得每个子问题只解决一次,最终获得原问题的答案。
递归问题——>重复子问题、最优子结构——>记忆化搜索(自顶向下)
——>动态规划(自底向上)
eg。斐波那契数列 0 1 1 2 3 5 8 13...
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;
vector<int> memo;
// 记忆化搜索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];
}
int main() {
int n = 1000;
memo = vector<int>(n+1,-1);
time_t startTime = clock();
int res = fib(n);
time_t endTime = clock();
cout<<"fib("<<n<<") = "<<res<<endl;
cout<<"time : "<<double(endTime-startTime)/CLOCKS_PER_SEC<<" s"<<endl;
return 0;
}
-----------------------
// 动态规划
int fib( int n ){
vector<int> memo(n+1, -1);
memo[0] = 0;
memo[1] = 1;
for( int i = 2 ; i <= n ; i ++ )
memo[i] = memo[i-1] + memo[i-2]; //自底向上
return memo[n];
}