走到指定位置有多少种方式-从暴力递归到动态规划(java)

这篇具有很好参考价值的文章主要介绍了走到指定位置有多少种方式-从暴力递归到动态规划(java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

假设有排成一行的N个位置记为1~N,
N一定大于或等于2
每次只能走一个位置
开始时机器人在其中的M位置上(M一定是1~N中的一个)
如果机器人来到1位置,那么下一步只能往右来到2位置;
如果机器人来到N位置,那么下一步只能往左来到N-1位置;
如果机器人来到中间位置,那么下一步可以往左走或者往右走; 规定机器人必须走K步,
最终能来到P位置(P也是1~N中的一个)的方法有多少种 给定四个参数 N、M、K、P,
返回方法数

暴力递归

解题思路:
类似爬楼梯的递归,每当选择一个位置时,步数会减一,
然后继续去递归别的可能性
一直到步数为0
如果刚好此时在指定位置,这种方法有效,返回1,否则返回0.
注意在1位置和终点位置时,只能单向选择.

代码演示,

  /**
     * 求有多少种走法
     * @param M
     * @param K
     * @param P
     * @param N
     * @return
     */
    public static int goWay(int M,int K,int P,int N){
        //边界条件,也可以再题意中限制掉,
        if(N < 2 || M < 1 || K < 1 || P < 1 || P > N || M > N){
            return -1;
        }
        return process(M,K,P,N);
    }

    /**
     *  机器人走到目标位置的有多少种方式的递归
     * @param M 机器人当前所在位置
     * @param K 还有K 步要走
     * @param P 目标位置
     * @param N 总共有多少位置.
     */
    public static int process(int M ,int K ,int P ,int N){
    	//base case 剩余0步,走完了,
    	//查看此时如果在指定位置,一种有效走法,返回1,
    	//否则返回0
        if(K == 0){
            return M == P ? 1 : 0;
        }
        //在1位置时 只能向右走
        if (M == 1){
            return process(M + 1,K - 1,P,N);
        }
        //在N 位置时 只能向左走
        if(M == N ){
            return process(N - 1,K - 1,P,N);
        }
        //z中间时可以向走也可以向右.
        return process(M - 1,K - 1,P,N) + process(M + 1,K - 1,P,N);
    }

递归+缓存

思路;
缓存是为了解决重复计算的问题,
思考下这个递归种的重复计算是什么,
就是在相同位置还剩相同步数的情况,
我们可以用缓存把这个记录下来,
位置和剩余步数两个参数,因为要用二维数组.

代码演示:

  /**
     * 递归加压缩
     * @param M
     * @param K
     * @param P
     * @param N
     * @return
     */
    public static int goWay2(int M ,int K ,int P ,int N){
        //边界条件,也可以再题意中限制掉,
        if(N < 2 || M < 1 || K < 1 || P < 1 || P > N || M > N){
            return -1;
        }
        int[][] dp = new int[N + 1][K + 1];
        for (int i = 0; i <= N ;i++){
            for (int j = 0; j <= K;j++){
                dp[i][j] = -1;
            }
        }
        return process2(M,K,P,N,dp);
    }

    /**
     *  递归加缓存
     * @param M 机器人当前所在位置
     * @param K 还有K 步要走
     * @param P 目标位置
     * @param N 总共有多少位置.
     * @param dp 缓存.
     */
    public static int process2(int M ,int K ,int P,int N,int[][]dp){
    //记忆化搜索,已经有了 就直接返回
        if(dp[M][K] != -1){
            return dp[M][K];
        }
        int ans = 0;
        if (K == 0){
            ans = M == P ? 1 : 0;
        } else if (M == 1) {
            ans = process2(M + 1,K - 1,P,N,dp);

        } else if (M == N) {
            ans = process2(M - 1,K - 1,P,N,dp);

        }else{
            ans = process2(M - 1,K - 1,P,N,dp)+process2(M + 1,K - 1,P,N,dp);
        }
        //将结果保存起来
        dp[M][K] = ans;
        return ans;
    }

动态规划

思路:
动态规划和第二种递归加缓存大致相同,
不同的是,动态规划是要根据规则先把缓存表填满.
然后调用时 直接从表中取.

代码演示

 /**
     * 动态规划
     * @param M 机器人当前所在位置
     * @param K 还有K 步要走
     * @param P 目标位置
     * @param N 总共有多少位置.
     * @return
     */
    public static int goWay3(int M ,int K ,int P,int N){

        int[][] dp = new int[N + 1][K + 1];
        dp[P][0] = 1;
        //i 所要走的步数
        for (int i = 1; i <= K;i++){
            dp[1][i] = dp[2][i - 1] ;
            //j 现在所在的位置.
            for(int j = 2;j < N ;j++){
                dp[j][i] = dp[j - 1][i - 1] + dp[j + 1][i - 1];
            }
            dp[N][i] = dp[N - 1][i - 1];
        }
        return dp[M][K];
    }

动态规划专题

斐波那契数列-从暴力递归到动态规划

零钱兑换,凑零钱问题,从暴力递归到动态规划文章来源地址https://www.toymoban.com/news/detail-471536.html

到了这里,关于走到指定位置有多少种方式-从暴力递归到动态规划(java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 左程云 Java 笔记--暴力递归--动态规划

    暴力递归就是尝试 1,把问题转化为规模缩小了的同类问题的子问题 2,有明确的不需要继续进行递归的条件(base case) 3,有当得到了子问题的结果之后的决策过程, 4,不记录每一个子问题的解 打印n层汉诺塔从最左边移动到最右边的全部过程 打印一个字符串的全部子序列,包

    2023年04月08日
    浏览(36)
  • 算法|9.从暴力递归到动态规划2

    题意:规定1和A对应、2和B对应、3和C对应…26和Z对应,那么一个数字字符串比如\\\"111”就可以转化为:“AAA”、“KA\\\"和\\\"AK” 给定一个只有数字字符组成的字符串str,返回有多少种转化结果 解题思路: 边界判断1:能够不被阻挡的走到最后,说明这个决策正确,返回1 边界判断2:0不

    2024年02月03日
    浏览(32)
  • 算法27:从暴力递归到动态规划(2)

    上一题比较简单,下面来一道比较难的题目。 假设有排成一行的 N 个位置,记为 1~ N , N 一定大于或等于 2 开始时机器人在其中的 M 位置上 ( M 一定是 1~ N 中的一个 ) 如果机器人来到 1 位置,那么下一步只能往右来到 2 位置; 如果机器人来到 N 位置,那么下一步只能往左来到

    2024年02月09日
    浏览(28)
  • 算法7.从暴力递归到动态规划0

    题意:打印n层汉诺塔从最左边移动到最右边的全部过程 解题思路: 把字母抛掉,变成左中右三个盘子 多个盘子能一下到吗?不能,把上边的拿走,最下边的才能放到指位置(leftToRight) 上边的怎么拿,leftToMid。那它具体怎么拿,midToLeft…如此,需要6个子过程 他们之间互相调

    2024年02月08日
    浏览(25)
  • 算法12.从暴力递归到动态规划5

    题意:假设有排成一行的N个位置记为1~N,N一定大于或等于2 开始时机器人在其中的M位置上(M一定是1~N中的一个) 如果机器人来到1位置,那么下一步只能往右来到2位置; 如果机器人来到N位置,那么下一步只能往左来到N-1位置; 如果机器人来到中间位置,那么下一步可以往左

    2024年02月20日
    浏览(32)
  • 一篇文章带你搞懂动态规划(由暴力递归到动态规划)

    ”动态规划“ 的过程相当于 记忆化搜索 , 即在普通 递归 的过程中用二维数组进行记忆化存储一些状态结果, 从而避免重复的计算(剪枝)。 举一个简单的例子:在 递归法 求解 斐波那契 数列的过程中, 就进行了多次的 重复计算 , 而动态规划相当于是对已经计算的状态

    2024年02月20日
    浏览(44)
  • 题解 | #上台阶#C++暴力动态规划解法,非递归

    25届想找实习求看看简历 英伟达笔试 Nvidia24秋招 英伟达嵌入式软件工程师笔试 9-26 2022-08-17-nvidia实习 我发现算法岗也不很难进啊(深度学习) 我发现算法岗也不很难进啊(深度学习) 顺丰科技 1.30校招实习招聘信息汇总 2024春招汇总 『 哨哥的校园招聘周报 』02/05 - 02/18 深圳银河创

    2024年02月21日
    浏览(28)
  • 爬楼梯问题-从暴力递归到动态规划(java)

    一个总共N 阶的楼梯(N 0) 每次只能上一阶或者两阶。问总共有多少种爬楼方式。 示例1: N = 1, 一步上去了,返回1. 示例2: N = 2时。 可以第一次上一阶,再上一阶,这是一种方式, 也可以一次直接上两阶,这也是一种方式, 返回 2; 示例3: N = 3: 可以选择, 1 1 1, 1

    2024年02月10日
    浏览(28)
  • 【LeetCode:72. 编辑距离 | 暴力递归=>记忆化搜索=>动态规划 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月06日
    浏览(31)
  • 【LeetCode:64. 最小路径和 | 暴力递归=>记忆化搜索=>动态规划 】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包