博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【leetcode】935. Knight Dialer
阅读量:5908 次
发布时间:2019-06-19

本文共 2020 字,大约阅读时间需要 6 分钟。

题目如下:

A chess knight can move as indicated in the chess diagram below:

 .           

 

This time, we place our chess knight on any numbered key of a phone pad (indicated above), and the knight makes N-1 hops.  Each hop must be from one key to another numbered key.

Each time it lands on a key (including the initial placement of the knight), it presses the number of that key, pressing N digits total.

How many distinct numbers can you dial in this manner?

Since the answer may be large, output the answer modulo 10^9 + 7.

Example 1:

Input: 1Output: 10

Example 2:

Input: 2Output: 20

Example 3:

Input: 3Output: 46

Note:

  • 1 <= N <= 5000

解题思路:很明显的动态规划的场景。首先我们可以维护如下的一个映射字典:key为到达的数字,value为可以由哪些数字经过一次跳跃到达key的数字。接下来假设dp[i][j] 为经过跳跃i次并且最后一次跳跃的终点是j,那么有dp[i][j] = dp[i-1][dic[j][0]] + dp[i-1][dic[j][1]] + ... dp[i-1][dic[j][n]]。最终的结果就是dp[N][0] + dp[N][1] + ... dp[N][9]。后来经过测试发现,这种解法会超时,因为题目约定了N最大是5000,因此可以事先计算出1~5000的所有结果缓存起来。

     dic[1] = [6,8]        dic[2] = [7,9]        dic[3] = [4,8]        dic[4] = [3,9,0]        dic[5] = []        dic[6] = [1,7,0]        dic[7] = [2,6]        dic[8] = [1,3]        dic[9] = [2,4]        dic[0] = [4,6]

代码如下:

class Solution(object):    res = []    def knightDialer(self, N):        """        :type N: int        :rtype: int        """        if len(self.res) != 0:            return self.res[N-1]        dic = {}        dic[1] = [6,8]        dic[2] = [7,9]        dic[3] = [4,8]        dic[4] = [3,9,0]        dic[5] = []        dic[6] = [1,7,0]        dic[7] = [2,6]        dic[8] = [1,3]        dic[9] = [2,4]        dic[0] = [4,6]        dp = []        for i in range(5001):            if i == 0:                tl = [1] * 10            else:                tl = [0] * 10            dp.append(tl)        for i in range(5001):            for j in range(10):                for k in dic[j]:                    dp[i][j] += dp[i-1][k]        for i in range(5001):            self.res.append(sum(dp[i]) % (pow(10,9) + 7))        return self.res[N-1]

 

转载于:https://www.cnblogs.com/seyjs/p/9911142.html

你可能感兴趣的文章
lagp,lacp详解
查看>>
LVS之DR模式原理与实践
查看>>
Docker的系统资源限制及验证
查看>>
c++ ios_base register_callback方法使用
查看>>
Java中为什么需要Object类,Object类为什么是所有类的父类
查看>>
angularjs-paste-upload
查看>>
linux基础命令 head
查看>>
objective c:import和include的区别, ""和<>区别
查看>>
The Shared folder with you
查看>>
sax方式解析XML学习笔记
查看>>
Springboot配置(上)
查看>>
java--Eclipse for mac 代码提示(代码助手,代码联想)快捷键修改
查看>>
left join on/right join on/inner join on/full join on连接
查看>>
template.helper 多参数
查看>>
Android 四大组件之一(Activity)
查看>>
扫描(一)
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
iostat命令学习
查看>>
html video的url更新,自动清缓存
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>