暴力递归转动态规划(八)

news2024/11/18 14:38:43

棋盘问题
将棋盘最左下角当作是平面直角坐标系的原点(0,0)位置,那么这个棋盘横坐标上就是9条线,纵坐标就是10条线,给定三个参数a、b、k,返回“马”从(0,0)位置出发,必须走K步,最后落在(a,b)上的方法数有多少种?
在这里插入图片描述

暴力递归
依然是先从暴力递归的方式开始分析,暴力递归方法要返回最大的方法数,而“马”在棋盘上可以向四周8个方向随意跳动,所以需要将每种方向跳动的结果集方法数进行累加。
base case:
第一个是当“马” 跳出棋盘范围。
第二个是当剩余 步数 为 0,此时如果正好落在(x,y)的位置,证明有一种方法。

//主方法,马从(0,0)位置开始跳
public static int jump(int a, int b, int k) {
        return process(0, 0, k, a, b);
    }

    //返回最大方法数
    //x,y 当前马的位置
    //a,b 目标位置
    //rest 剩余步数
    public static int process(int x, int y, int rest, int a, int b) {
    	// 当马跳出棋盘范围,return 0
        if (x > 8 || x < 0 || y > 9 || y < 0) {
            return 0;
        }
        //当步数为0时,如果落在了 ab位置,说明有一种方法数
        if (rest == 0) {
            return (x == a) && (y == b) ? 1 : 0;
        }
        int ways = 0;
		//马每次都可以在棋盘上向四周8个方向跳。将所有方法数累加。
		//每跳一次,步数 - 1,x,y根据 象棋中 马走日的规则进行调整 
        ways += process(x + 2, y + 1, rest - 1, a, b);
        ways += process(x - 2, y + 1, rest - 1, a, b);
        ways += process(x - 1, y + 2, rest - 1, a, b);
        ways += process(x + 1, y + 2, rest - 1, a, b);
        ways += process(x - 2, y - 1, rest - 1, a, b);
        ways += process(x + 2, y - 1, rest - 1, a, b);
        ways += process(x - 1, y - 2, rest - 1, a, b);
        ways += process(x + 1, y - 2, rest - 1, a, b);
        return ways;
    }

动态规划
继续根据暴力递归方法来改写动态规划,暴力递归方法中的可变参数为x,y和k,步数每次 - 1 ,xy是马的当前位置。所以这个dp表的构建和以往不同,是个三维数组。
接下来确定数组大小:

  1. k是步数,并且可以步数为0,所以k的 范围是 K + 1。
  2. xy是当前马的位置,并且只能在棋盘范围内跳动所以xy的大小是9,10
  3. 所以dp表的整体大小是 dp[9][10][K + 1]。

接下来根据暴力递归中的base case来给数组进行初始化赋值。
当rest剩余步数为0时,如果此时xy正好在ab上,则方法数为1。所以 dp[a][b][0] == 1。
因为是3维数组,所以先填充最底层的rest,根据是rest的依赖关系来确定xy的值,而根据暴力递归代码可以看出,rest是每次 - 1,所以从0开始填充。
代码
代码中需要注意的是pick方法,因为马可能会跳出棋盘,遇到这种情况不用统计,利用pick进行过滤即可。

public static int dp(int a, int b, int k) {
        int[][][] dp = new int[9][10][k + 1];
        dp[a][b][0] = 1;

        for (int rest = 1; rest <= k; rest++) {
            for (int x = 0; x < 9; x++) {
                for (int y = 0; y < 10; y++) {
                    int ways = pick(dp,x + 2, y + 1, rest - 1);
                    ways += pick(dp,x - 2, y + 1, rest - 1);
                    ways += pick(dp,x - 1, y + 2, rest - 1);
                    ways += pick(dp,x + 1, y + 2, rest - 1);
                    ways += pick(dp,x - 2, y - 1, rest - 1);
                    ways += pick(dp,x + 2, y - 1, rest - 1);
                    ways += pick(dp,x - 1, y - 2, rest - 1);
                    ways += pick(dp,x + 1, y - 2, rest - 1);
                    dp[x][y][rest] = ways;
                }
            }
        }
        return dp[0][0][k];
    }

    public static int pick(int[][][] dp, int x, int y, int rest) {
        if (x > 8 || x < 0 || y > 9 || y < 0) {
            return 0;
        }
        return dp[x][y][rest];
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF reverse3 1

先运行下 看来是输入正确的flag 使用DIE查看文件 看起来没有壳&#xff0c;直接IDA打开 shift F12查找字符串 一路跟踪 到汇编窗口后F5 这里对Destination和Str2进行比较&#xff0c;Str2有值那么Str2就是经过上面一系列处理之后得到的内容了 继续分析上面的代码 根据…

企业电子杂志如何制作与分享

企业电子杂志相比传统纸质杂志具有更多的多媒体展示方式。在制作过程中&#xff0c;可以添加视频、音频、动画等多媒体元素来丰富电子杂志的内容&#xff0c;给人以独特的阅读体验。 如何制作企业电子杂志并分享出去&#xff1f;推荐用FLBOOK&#xff0c;可以快速做出漂亮的翻…

软考报名全流程及注意事项

软考报名方式有两种&#xff1a;现场报名与网上报名 现场报名&#xff1a; 由本人提出申请&#xff0c;按照规定携带身份证明到当地考试管理机构报名&#xff0c;领取准考证。 凭准考证、身份证明在指定的时间、地点考试。 具体各个省份&#xff0c;请考生登录所在省的软考…

C#学习系列相关之多线程(四)----async和await的用法

一、async、await用法的作用 async用法主要是用来作为修饰符将方法作为异步方法使用&#xff0c;await关键字只用作为在异步方法才能使用&#xff0c;也就是只有当方法有async修饰后&#xff0c;才能在方法中使用await&#xff0c;await后跟Task新的任务启动。&#xff08;awai…

MySQL数据库技术笔记(5)

聚合函数&#xff1a; count(): 统计某种数据的数量 sum(): 统计某种数据的总和 max(): 某种数据的最大值 min(): 某种数据的最小值 avg(): 某种数据的平均值 排序的用法 : 关键字 order by 升序 : ASC &#xff08;从小到大排序&#xff09; 默认为升序 降序 : DESC…

基于拉丁超立方法的风光场景生成与削减

代码链接&#xff1a;基于拉丁超立方法的风光场景生成与削减 摘要&#xff1a;与蒙特卡洛法不同&#xff0c;拉丁超立方采样改进了采样策略能够做到较小采样规模中获得较高的采样精度&#xff0c;属于分层抽样技术&#xff0c;设定风光出力遵从正态分布normrnd&#xff0c;从而…

d3dcompiler_43.dll是什么文件?缺失d3dcompiler_43.dll文件修复与解决方法

今天我要和大家分享的是关于d3dcompiler_43.dll丢失的解决方法。我相信很多网友在使用电脑时都遇到过这个问题&#xff0c;那么接下来就让我们一起来探讨一下如何解决这个问题吧&#xff01; 首先&#xff0c;让我们来了解一下d3dcompiler_43.dll文件的总体介绍。d3dcompiler_…

天津权威大数据培训机构 数据分析师的就业薪资多少?

中国大数据产业起步晚&#xff0c;发展速度快&#xff0c;物联网、移动互联网的迅速发展&#xff0c;使数据产生速度加快、规模加大&#xff0c;迫切需要运用大数据手段进行分析处理&#xff0c;提炼其中的有效信息。 学大数据可就业的行业 随着大数据技术的普及和应用&#…

推进高校学生党建工作数字化建设的思考

高校学生党建工作数字化建设是指利用现代信息技术手段&#xff0c;对高校学生党建工作进行全面、深入的改革和创新&#xff0c;以推进学生党员教育管理服务工作的现代化和精细化发展。 下面将从以下几个方面对高校学生党建工作数字化建设进行详细介绍。 一、背景分析 随着信…

“中式汉堡”塔斯汀圈粉受众的秘诀是什么?

在近几年的餐饮品牌中&#xff0c;塔斯汀堪称逆势扩张的典范&#xff0c;作为国人自己的汉堡品牌&#xff0c;它历经十一年的发展历程&#xff0c;为什么塔斯汀能在一众肯德基、麦当劳中异军突起&#xff0c;圈粉无数人&#xff1f;下面就让媒介盒子为你揭秘&#xff01; 一、 …

使用vlc获取海康威视视频流

1.下载相关软件 1.1海康威视官网-服务支持-工具软件-设备网络搜索 下载地址&#xff1a; https://www.hikvision.com/cn/support/tools/hitools/注意&#xff1a;必须跟摄像头在同一个局域网下才可以使用设备网络搜索工具&#xff0c;才能使用vlc获取到视频流。 1.2下载VLC …

2023最新版Android逆向教程——第2天:dex反编译工具的安装和使用

目录 一、jadx的安装和使用1.1 jadx 的简介1.2 jadx 的安装1.3 jadx 的命令1.4 jadx-gui 的使用方法1.5 常见问题 二、gda的安装和使用三、JEB的安装和使用3.1 JEB的简介3.2 JEB的安装3.3 JEB实战 每个 Android App 都有对应的安装包&#xff0c;是以 apk 为名字后缀的文件&…

掌握 Git:代码版本控制的基本步骤(强力推荐的工具)

fairleevivobook:~/CLionProjects/SDL_SLAM$ git init提示&#xff1a;使用 master 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中 提示&#xff1a;配置使用初始分支名&#xff0c;并消除这条警告&#xff0c;请执行&#xff1a; 提示&#xff1a; 提示&…

通过Node.js获取高德的省市区数据并插入数据库

通过Node.js获取高德的省市区数据并插入数据库 1 创建秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 获取数据并插入2.1 创建数据库连接工具2.2 请求数据2.3 数据处理2.4 全部代码 3 还可以打印文件到本地 1 创建秘钥 1.1 登录高德地图开放平台 打开开放平…

使用Python采集京东商品评论并保存至本地

不知道各位网购的时候&#xff0c;是否会去留意商品评价&#xff0c;有些小伙伴是很在意评价的&#xff0c;看到差评就不想买了&#xff0c;而有些小伙伴则是会对差评进行理性分析&#xff0c;而还有一类人不在乎这个。京东作为中国最大的电商平台之一&#xff0c;拥有大量的商…

如何使用ChatGPT编写更好的代码

生成代码是ChatGPT和其他遵循指令运行的大型语言模型(LLM)一个功能强大的应用。如果得到正确的提示&#xff0c;大型语言模型(LLM)可以生成程序员可能需要数小时才能编写的代码。 然而&#xff0c;大型语言模型(LLM)并不能完成程序员的所有工作。他们无法分解复杂的问题&#x…

学生用RockyLinux9.2模板虚拟机说明

“RockyLinux9.2”模板虚拟机下载地址 链接&#xff1a;https://pan.baidu.com/s/1xcakszIQ7Kp9Nw_NA9Znlg?pwdqzmm 提取码&#xff1a;qzmm 1.模板机是基于“Rocky-9.2-x86_64-minimal.iso”安装 2.模板机是2023.10.10执行dnf update && dnf upgrade更新和升级软件…

Unity_相机灵活跟随角色移动

每日一句&#xff1a;慢慢改变&#xff0c;慢慢成长&#xff0c;慢慢适应&#xff0c;慢慢优秀 目录 角色旋转、移动类 相机跟随人物移动类 角色旋转、移动类 /*旋转刚体&#xff0c;位移的动画驱动移动*/ using System.Collections;using System.Collections.Generic;using…

一套完整的软件测试面试流程(面试题),这些题你真的都能答上吗?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自我介绍 2、…

外汇天眼:外汇交易商常见黑心手法大公开!投资务必留意这5种骗局

众所周知&#xff0c;外汇市场无论在交易量、流动性方面都是世界之最&#xff0c;如今随着网络科技愈来愈发达&#xff0c;任何人都能通过手机使用全球的经纪商&#xff0c;随时随地在线上进行外汇保证金交易。 然而&#xff0c;市面上充斥各种黑平台与假券商&#xff0c;投资人…