算法学习

本文介绍了动态规划的基本概念及其实现方式,并通过斐波那契数列的实例对比了递归、记忆化搜索(自顶向下)和动态规划(自底向上)三种算法的不同实现方法及其效率差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值