首页 > 编程语言 >算法:动态规划思路(仅作记录)

算法:动态规划思路(仅作记录)

时间:2024-09-18 23:16:25浏览次数:1  
标签:return 递归 int cache 仅作 算法 climbStairs 思路 递推

以leetcode70题爬楼梯为例:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

递归
一共两种爬楼梯的方式
如果最后一步要用到方法1,那么我们得先爬到 n−1,要解决的问题缩小成:从 0 爬到 n−1 有多少种不同的方法。
如果最后一步要用到方法2,那么我们得先爬到 n−2,要解决的问题缩小成:从 0 爬到 n−2 有多少种不同的方法。
从 0 爬到 n 的方法数等于这两种方法数之和,即
f(n) = f(n-1) + f(n-2)

int climbStairs(int n) {
     //n=1时,不存在n-2,因此不带入f(n)
    if(n==1){ 
        return 1;
    }
    return f(n);
}
int f(int n){
    if(n==0 || n==1){
        return 1;
    }
    return f(n-1) + f(n-2);
}

递归+记忆化搜索
递归时有重复大量计算的情况: 如f(5)=f(4)+f(3),f(4)=f(3)+f(2),使用列表保存第一次计算f(n)的值,后续如果需要再计算f(n)时直接返回,不进入后续递归,记录下计算f(4)时f(3)结果,在计算f(5)时直接返回=f(4)+cache[3]。
时间复杂度:O(n),需要在每个节点第一次出现时计算,一共n次。

vector<int> cache;
int climbStairs(int n) {
    if(n==1){
        return 1;
    }
    cache.resize(n+1, -1);
    return f(n);
}
int f(int n){
    if(n==0 || n==1){
        return 1;
    }
    if (cache[n] != -1){
        return cache[n];
    }
    int res = f(n-1) + f(n-2);
    cache[n] = res;
    return res;
}

递推(自底向上)
在递归时我们为了使f(n)到达我们已知的递归边界f(0)与f(1),将f(n)自顶向下拆分为子问题,又将子问题的结果归上去(有种折返跑的感觉)。
所有我们可以使用递推,直接从边界开始累加到f(n),运行速度显著快于递归。
时间复杂度:O(n)
空间复杂度:O(n),创建了长度为n+1的列表

int climbStairs(int n) {
    vector<int> f(n+1, 1);
    for(int i=2;i<n+1;i++){
        f[i] = f[i-1] + f[i-2];
    }
    return f[n];
}

递推+空间优化
实际上在递推的过程中我们只使用了,三个变量,f[i], f[i-1]与f[i-2],对于列表f,每次计算时,在f[i-2]之前所保存的值再也不会被使用,实际上它们已经包含在由它们累加而来的f[i-1]和f[i-2]中了,因此可以直接使用这三个变量替换列表。

int climbStairs(int n) {
    // vector<int> f(n+1, 1);
    int f_1 = 1, f_2 = 1, new_f = 0;
    // f_1上一个,即f[i-1],f_2上上一个即f[i-2],它们第一次出现时,为f(1)与f(0)=1
    for(int i=2;i<=n;i++){
        // f[i] = f[i-1] + f[i-2];
        new_f = f_1 + f_2;
        f_2 = f_1;
        f_1 = new_f;
    }
    return new_f;
}

标签:return,递归,int,cache,仅作,算法,climbStairs,思路,递推
From: https://www.cnblogs.com/lanying24/p/18419467

相关文章

  • 如何使用ChatGPT帮你写论文?有思路有教程【小白上手指南】
    停留5分钟看完这篇文章,绝对让你写论文如虎添翼我这里先给你提供一下思路,再进行详细说明一、框架1、设定ChatGPT的背景你把主题和开题报告以及要求发给它,并告知是什么学位等等,此处建议你做一个专门的助手2、列出大纲要求它列出写作大纲,你根据它写的大纲看是否要进行调整,如......
  • 自动驾驶运动规划学习_碰撞检测算法_GJK
    自动驾驶运动规划学习:碰撞检测算法:GJKGilbert–Johnson–Keerthi(GJK)算法,是一种用于检测两个凸集是否重叠的高效算法,并且可以得到两个凸集的最小距离.1.4.1 GJK算法原理1.4.1.1 闵可夫斯基差(Minkowski Difference)1.4.1.3 凸性在二维空间中,如果一个凸集包含原......
  • Dijkstra 算法
    普通堆实现的Dijkstra算法时间复杂度为O(m*logm),m为边数distance[i]表示从源点到i点的最短距离,visited[i]表示i节点是否从小根堆弹出过准备好小根堆,小根堆存放记录:(x点,源点到x的距离),小根堆根据距离排序令distance[源点]=0,(源点,0)入堆从小根堆弹出(u......
  • Yargs里的Levenshtein距离算法
    “Yargs是一个Node.js库,专为那些想要解析命令行选项字符串的开发者设计。”yargs介绍yargs是一个用于解析命令行参数的流行库,周下载量达到了惊人的93154k,它能帮助开发者轻松地定义CLI(命令行接口),并提供参数处理、命令组织、help文本自动生成等功能。它通过简洁的API使......
  • 地平线占用预测 FlashOcc 参考算法-V1.0
    1.简介3DOccupancyNetworks的基本思路是将三维空间划分成体素网格,并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3Doccupancy可以对道路障碍物进行更细粒度的划分,同时获取更精确的占用和语......
  • 代码随想录算法 - 回溯算法1
    题目177.组合给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。你可以按任何顺序返回答案。示例1:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]示例2:输入:n=1,k=1输出:[[1]]提示:1<=n<=201<=k<=......
  • AI编程的特点及SCSAI平台在AI编程方面的一些思路
    团长团 AI智造AI编程 2024年09月18日18:25 北京说先来看看AI编程的优缺点,然后我们再看看SCSAI在AI编程方面的一些可能选择使用AI编程的优点‌AI编程的优点包括提升编程效率、降低编程门槛、优化程序结构、加强软件可靠性、促进跨领域融合,而缺点则包括安全性难题、知......
  • 深入理解算法效率:时间复杂度与空间复杂度
    目录引言一、算法效率的基础二、时间复杂度1.概念2.常见类型1.O(1)—常数阶 2.O(n)—线性阶3.O(n^2)—平方阶4.O(2^......
  • 数据挖掘实战-基于朴素贝叶斯算法构建真假新闻分类模型
     ......
  • 代码随想录算法训练营,9月18日 | 77.组合,216.组合总和III,17.电话号码的字母组合
    回溯算法理论基础:1.回溯是递归的副产品,有递归就有回溯。2.回溯的本质是穷举,想让回溯法高效些,可以加一些剪枝的操作3.组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按......