栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

暴力递归到动态规划 01 (机器人移动)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

暴力递归到动态规划 01 (机器人移动)

1. 题目

2. 暴力递归
    
    public static int getWays(int length, int cur, int steps, int target) {
        //如果剩余步数为0
        if (steps == 0) {
            //判断当前位置是不是目标位置
            if (cur == target) {
                return 1;
            } else {
                return 0;
            }
        }
        //左边界
        if (cur == 1) {
            //移动到2位置
            return getWays(length, 2, steps - 1, target);
        }
        //右边界
        if (cur == length) {
            //移动到右边倒数第二个位置
            return getWays(length, length - 1, steps - 1, target);
        }
        //中间位置
        return getWays(length, cur - 1, steps - 1, target) + getWays(length, cur + 1, steps - 1, target);
    }

动态规划

   
    public static int getWays2(int length, int cur, int steps, int target) {
        //纵行 为 路径,横行为剩余步数
        int[][] dp = new int[length + 1][steps + 1];
        //第1列初始化,当步数为0的时候,如果
        dp[target][0] = 1;
        for (int i = 1; i <= steps; i++) {
            //第0行为length=0,不存在
            //第一行可以直接初始化,因为是位于左边界,只能移动到第二个位置
            dp[1][i] = dp[2][i - 1];
            for (int j = 2; j < length; j++) {
                //除了一行和最后一行(左右边界),其余行都是左右之和
                dp[j][i] = dp[j - 1][i - 1] + dp[j + 1][i - 1];
            }
            //如果遇到右边界,直接走倒数第二位
            dp[length][i] = dp[length - 1][i - 1];
        }
        //返回目标位置的数量
        return dp[cur][steps];
    }

    public static void main(String[] args) {
        System.out.println(getWays(4, 2, 4, 4));
        System.out.println(getWays(5, 2, 6, 4));
        System.out.println(getWays2(4, 2, 4, 4));
        System.out.println(getWays2(5, 2, 6, 4));
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029503.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号