LeetCode 0935.骑士拨号器:动态规划(DP)

【LetMeFly】935.骑士拨号器:动态规划(DP)

力扣题目链接:https://leetcode.cn/problems/knight-dialer/

象棋骑士有一个独特的移动方式,它可以垂直移动两个方格,水平移动一个方格,或者水平移动两个方格,垂直移动一个方格(两者都形成一个 的形状)。

象棋骑士可能的移动方式如下图所示:

我们有一个象棋骑士和一个电话垫,如下所示,骑士只能站在一个数字单元格上(即蓝色单元格)。

给定一个整数 n,返回我们可以拨多少个长度为 n 的不同电话号码。

你可以将骑士放置在任何数字单元格上,然后你应该执行 n - 1 次移动来获得长度为 n 的号码。所有的跳跃应该是有效的骑士跳跃。

因为答案可能很大,所以输出答案模 109 + 7.

 

    示例 1:

    输入:n = 1
    输出:10
    解释:我们需要拨一个长度为1的数字,所以把骑士放在10个单元格中的任何一个数字单元格上都能满足条件。
    

    示例 2:

    输入:n = 2
    输出:20
    解释:我们可以拨打的所有有效号码为[04, 06, 16, 18, 27, 29, 34, 38, 40, 43, 49, 60, 61, 67, 72, 76, 81, 83, 92, 94]
    

    示例 3:

    输入:n = 3131
    输出:136006598
    解释:注意取模
    

     

    提示:

    • 1 <= n <= 5000

    解题方法:动态规划

    使用 d p [ i ] dp[i] dp[i]代表当前这一步号码为 i i i时的总方案数,初始值 d p [ 0 ] = d p [ 1 ] = ⋯ = d p [ 9 ] = 0 dp[0] = dp[1] = \cdots = dp[9] = 0 dp[0]=dp[1]==dp[9]=0

    预先打表一个 c a n F r o m canFrom canFrom数组, c a n F r o m [ i ] canFrom[i] canFrom[i]代表能从哪些号码一步到达号码 i i i:

    canFrom = {{4, 6},  // 0可以来自4,6{6, 8},{7, 9},{4, 8},{3, 9, 0},{},{1, 7, 0},{2, 6},{1, 3},{2, 4}
    };
    

    之后从第2个号码开始,假设当前号码为 i i i,则有状态转移方程:

    d p [ i ] = s u m ( d p [ f r o m ] ) , f r o m ∈ c a n F r o m [ i ] dp[i] = sum(dp[from]), from \in canFrom[i] dp[i]=sum(dp[from]),fromcanFrom[i]

    • 时间复杂度 O ( n ) O(n) O(n),其中常数比较大,为canFrom数组中的数据量20
    • 空间复杂度 O ( 1 ) O(1) O(1)

    AC代码

    C++
    const vector<vector<int>> canFrom = {{4, 6},  // 0可以来自4,6{6, 8},{7, 9},{4, 8},{3, 9, 0},{},{1, 7, 0},{2, 6},{1, 3},{2, 4}
    };
    const int mod = 1e9 + 7;class Solution {
    public:int knightDialer(int n) {int last[10], now[10];fill(last, last + 10, 1);for (int i = 2; i <= n; i++) {memset(now, 0, sizeof(now));for (int j = 0; j < 10; j++) {for (int from : canFrom[j]) {now[j] = (now[j] + last[from]) % mod;}}memcpy(last, now, sizeof(now));}// return accumulate(last, last + 10, 0);  // WA,这里没取模int ans = 0;for (int i = 0; i < 10; i++) {ans = (ans + last[i]) % mod;}return ans;}
    };
    
    Python
    # AC,57.50%,56.76%
    CAN_FROM = [[4, 6],[6, 8],[7, 9],[4, 8],[3, 9, 0],[], [1, 7, 0],[2, 6],[1, 3],[2, 4]
    ]
    MOD = 1_000_000_007class Solution:def knightDialer(self, n: int) -> int:last = [1] * 10for _ in range(n - 1):now = [0] * 10for i in range(10):for j in CAN_FROM[i]:now[i] = (now[i] + last[j]) % MODlast = nowreturn sum(last) % MOD
    
    Java
    import java.util.Arrays;class Solution {private final int[][] canFrom = {{4, 6},  // 0可以来自4,6{6, 8},{7, 9},{4, 8},{3, 9, 0},{},{1, 7, 0},{2, 6},{1, 3},{2, 4}};private final int mod = 1000000007;public int knightDialer(int n) {int[] last = new int[10];int[] now = new int[10];Arrays.fill(last, 1);for (int i = 2; i <= n; i++) {for (int j = 0; j < 10; j++) {for (int from : canFrom[j]) {now[j] = (now[j] + last[from]) % mod;}}last = now;}int ans = 0;for (int i = 0; i < 10; i++) {ans = (ans + last[i]) % mod;}return ans;}
    }
    
    Go
    package mainvar canFrom = [][]int{{4, 6},  // 0可以来自4,6{6, 8},{7, 9},{4, 8},{3, 9, 0},{},{1, 7, 0},{2, 6},{1, 3},{2, 4},
    };
    var mod = 1000000007func knightDialer(n int) (ans int) {last := make([]int, 10)for i := range last {last[i] = 1}for i := 2; i <= n; i++ {now := make([]int, 10)for j := 0; j < 10; j++ {for _, from := range canFrom[j] {now[j] = (now[j] + last[from]) % mod}}last = now}for i := range last {ans = (ans + last[i]) % mod;}return
    }
    

    同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

    Tisfy:https://letmefly.blog.csdn.net/article/details/144375933

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

    如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    String【Redis对象篇】

    &#x1f3c6; 作者简介&#xff1a;席万里 ⚡ 个人网站&#xff1a;https://dahua.bloggo.chat/ ✍️ 一名后端开发小趴菜&#xff0c;同时略懂Vue与React前端技术&#xff0c;也了解一点微信小程序开发。 &#x1f37b; 对计算机充满兴趣&#xff0c;愿意并且希望学习更多的技…

    生成SSH秘钥文件

    git生成文件命令 # 配置用户名和邮箱 git config --global user.name "你的GitHub用户名" git config --global user.email "你的GitHub邮箱"# 生成ssh-key ssh-keygen -t rsa -C “你的GitHub邮箱" # 验证 ssh -T gitgithub .com 第一步&#xff1a;…

    mac删除程序坞(Dock)中“无法打开的程序“

    参考&#xff1a; Mac删除软件之后图标还在怎么办&#xff1f;https://blog.csdn.net/weixin_46500474/article/details/124284161Mac程序坞中软件删除出现残留“&#xff1f;”图标无法删除解决方法&#xff1a; https://blog.csdn.net/shenwenhao1990/article/details/12865…

    前端学习笔记-Vue篇-03

    3、使用Vue脚手架 Home | Vue CLI 3.1 具体步骤 第一步(仅第一次执行):全局安装vue/cli npm install -g vue/clie第二步:切换到你要创建项目的目录&#xff0c;然后使用命令创建项目 vue create xxxx第三步:启动项目npm run serve 3.2 脚手架项目的结构 ----…

    Ubuntu上使用system()函数运行不需要输入密码

    使用system()运行一些终端命令的时候&#xff0c;需要sudo权限&#xff0c;也就是必须输入密码&#xff0c;那么在程序自启动的时候就无法成功启动。如果设置Ubuntu下所有操作都不需要密码&#xff0c;安全性太低&#xff0c;所以我们可以将需要用到的终端指令给予无需输入密码…

    学习记录:js算法(一百一十九):网络延迟时间

    文章目录 网络延迟时间思路一 网络延迟时间 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列表 times&#xff0c;表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi)&#xff0c;其中 ui 是源节点&#xff0c;vi 是目标节点&#xff0c; wi 是一个信号从源节点…

    嵌入式硬件-- 元器件焊接

    1.锡膏的使用 锡膏要保存在冰箱里。 焊接排线端子&#xff1b;138度的低温锡&#xff08;锡膏&#xff09;&#xff0c; 第一次使用&#xff0c;直接拿东西挑一点涂在引脚上&#xff0c;不知道多少合适&#xff0c;加热台加热到260左右&#xff0c;放在上面观察锡融化&#…

    Cocos Creator 开发微信小游戏分包

    作为以后端选手,吭哧吭哧的好不容易用cocos开发了一款小游戏, 上传的时候发现包太大了,主包超过4M; 我不是选小游戏分包了吗? 怎么还超? 分包的方案: 功能裁剪资源压缩主包迁移WASM分离 1. 功能裁剪 项目设置中引擎管理器中 功能裁剪里面有很多个引擎,我们剔除掉没用的引…

    华为eNSP实验:VRRP基本配置

    VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络冗余协议&#xff0c;旨在提高网络的可靠性和容错能力。VRRP通过把几台路由设备联合组成一台虚拟的路由设备&#xff0c;将虚拟路由设备的IP地址作为用户的默认网关实现与外部网络通信。 实验拓扑&a…

    axi can ip相关笔记

    1&#xff0c;can_clk最大24m&#xff0c;最后用的24m 2&#xff0c;axi总线不超过100m&#xff0c;且大于can_clk&#xff0c;最后用的100m 结构如下&#xff1a; 3&#xff0c;axi can ip需要专门的license&#xff0c;否则会导致不能生成bitstream 4&#xff0c;编…

    单臂路由配置

    知识点 单臂路由指在路由器上的一个接口配置子接口&#xff08;逻辑接口&#xff09;来实现不同vlan间通信 路由器上的每个物理接口都可以配置多个子接口&#xff08;逻辑接口&#xff09; 公司的财务部、技术部和业务部有多台计算机&#xff0c;它们使用一台二层交换机进行互…

    STM32F103单片机使用STM32CubeMX创建IAR串口工程

    打开stm32cubeMX&#xff0c;选择新建工程 输入单片机型号&#xff0c;在下面选中具体型号&#xff0c;然后点右上角 开始工程 第一步设置 调试接口&#xff0c;否则生成的工程就会下载不到单片机中&#xff0c;使用stlink或者jlink的话&#xff0c;在debug选项中直接选择ser…

    【笔记】分布式任务调度平台XXL-JOB

    这篇笔记主要记录以下内容&#xff1a; &#xff08;1&#xff09;第一次启动xxl-job的过程 &#xff08;2&#xff09;模块、文件、数据库&#xff08;表和字段&#xff09;的作用 &#xff08;3&#xff09;极少的源码解读&#xff08;XxlJobConfig&#xff09; 有点像实…

    hbuilder 安卓app手机调试中基座如何设置

    app端使用基座 手机在线预览功能 1.点击运行 2.点击运行到手机或者模拟器 3.制作自定义调试基座 4.先生成证书【可以看我上一篇文档写的有】&#xff0c;点击打包 5.打包出android自定义调试基座【android_debug.apk】,【就跟app打包一样需要等个几分钟】 6.点击运行到手…

    uniapp中父组件传参到子组件页面渲染不生效问题处理实战记录

    上篇文件介绍了,父组件数据更新正常但是页面渲染不生效的问题,详情可以看下:uniapp中父组件数组更新后与页面渲染数组不一致实战记录 本文在此基础上由于新增需求衍生出新的问题.本文只记录一下解决思路. 下面说下新增需求方便理解场景: 商品信息设置中添加抽奖概率设置…

    零基础学安全--Burp Suite验证码识别以及爆破

    目录 学习连接 本次文章直接以例子来讲解 正式开始 插件安装 抓取验证码脚本下载 识别验证码脚本下载 将插件导入到BP中 开始识别 目标寻找 验证码连接获取 运行.pyt文件 BP抓取加载验证码的数据包&#xff0c;就是如下数据包观察以下和那个验证码连接​编辑 将包发…

    js面试题|[2024-12-10]

    1.延迟加载JS有哪些方式&#xff1f; 延迟加载&#xff1a;async、defer 例如&#xff1a;<script defer type"text/javascript" srcscript.js></script> defer&#xff1a;等html全部解析完毕&#xff0c;才会执行js代码&#xff0c;顺次执行js脚本 asy…

    朗新科技集团如何用云消息队列 RocketMQ 版“快、准、狠”破解业务难题?

    作者&#xff1a;邹星宇、刘尧 朗新科技集团&#xff1a;让数字化的世界更美好 朗新科技集团股份有限公司是领先的能源科技企业&#xff0c;长期深耕电力能源领域&#xff0c;通过新一代数字化、人工智能、物联网、电力电子技术等新质生产力&#xff0c;服务城市、产业、生活中…

    在ArcGISPro中创作精美地图

    建议从数据下载到最后的出图都跟着走一下&#xff0c;提供了一个完整且全面的教程&#xff0c;建议从数据下载开始&#xff0c;这样可以对ArcGISPro制图流程有一个全面的感触和认知。 1. 绘制北极海冰地图 20 世纪&#xff0c;气候变化导致极地海冰迅速减少。 自 1978 年以来…

    鸿蒙实现数据管理

    目录&#xff1a; 1、鸿蒙实现数据管理的三种方式2、用户首选项3、键值型数据管理3.1、获取KVManager实例&#xff0c;用于管理数据库对象3.2、创建并获取键值数据库3.3、调用put()方法向键值数据库中插入数据3.4、调用get()方法获取指定键的值3.5、调用delete()方法删除指定键…