活用動態規劃DP 特殊的騎士撥號器 Knight Dialer_Leetcode #935

閱讀時間約 5 分鐘

題目敘述

題目會給定一組數字鍵盤,要求我們每次撥號的時候都走象棋的"馬"步,也就是日字型的走法,請問給定長度的n的數字撥號方式有幾種?

最後回傳答案之前,記得對109 + 7做除法取餘數。

詳細的題目可在這裡看到

數字鍵盤的配置如下圖

在側邊欄中搜尋

在側邊欄中搜尋

象棋的"馬"步 日字型走法 示意圖

在側邊欄中搜尋

在側邊欄中搜尋


測試範例

Example 1:

Input: n = 1
Output: 10
Explanation: We need to dial a number of length 1, so placing the knight over any numeric cell of the 10 cells is sufficient.

Example 2:

Input: n = 2
Output: 20
Explanation: All the valid number we can dial are [04, 06, 16, 18, 27, 29, 34, 38, 40, 43, 49, 60, 61, 67, 72, 76, 81, 83, 92, 94]

Example 3:

Input: n = 3131
Output: 136006598
Explanation: Please take care of the mod.

約束條件

Constraints:

  • 1 <= n <= 5000

演算法

其實和前面介紹過 計算有幾個母音直線排列 的那題很像,數字鍵盤定義域和值域都是固定的,可以先找出狀態轉移的State transfer diagram。再從狀態機的State transfer diagram實作出bottom-up的DP解法。


從數字鍵盤的位置和撥號規則(走馬步)找出規律

現在狀態,前一個狀態:

現在的0可以由前一步的4, 6走過來

現在的1可以由前一步的6, 8走過來

現在的2可以由前一步的7, 9走過來

現在的3可以由前一步的4, 8走過來

現在的4可以由前一步的0, 3, 9走過來

現在的5 無法由其他數字走過來 (實作上的細節,請留意)

現在的6可以由前一步的0, 1, 7走過來

現在的7可以由前一步的2, 6走過來

現在的8可以由前一步的1, 3走過來

現在的9可以由前一步的2, 4走過來


有了這些狀態轉移關係式後,就可以用迴圈,每次迭代更新數字鍵盤撥號的方法總數。


程式碼

class Solution:
 def knightDialer(self, N):
  
  '''
  State Transfer function
  Cur state comes from previous state
  0   <-> 4, 6
  1   <-> 6, 8
  2   <-> 7, 9
  3   <-> 4, 8
  4   <-> 0, 3, 9
  5   <-> NULL (i.e. No solution when length >= 2 )
  6   <-> 0, 1, 7
  7   <-> 2, 6
  8   <-> 1, 3
  9   <-> 2, 4
  '''

  CONSTANT = 10**9+7
  method_count = [1 for _ in range(10)]

  for step in range(N-1):
   prev = method_count.copy()
   method_count[0] = prev[4] + prev[6]
   method_count[1] = prev[6] + prev[8]
   method_count[2] = prev[7] + prev[9]
   method_count[3] = prev[4] + prev[8]
   method_count[4] = prev[0] + prev[3] + prev[9]
   method_count[5] = 0 # NULL
   method_count[6] = prev[0] + prev[1] + prev[7]
   method_count[7] = prev[2] + prev[6]
   method_count[8] = prev[1] + prev[3]
   method_count[9] = prev[2] + prev[4]

  return sum(method_count) % CONSTANT

複雜度分析

時間複雜度:

O( n ) bottom-up 從 撥號長度為1 開始遞迴更新到 撥號長度為n。

空間複雜度:

O( 1 ) 使用到的是固定大小,長度為10的暫存陣列 prev。


關鍵知識點

關鍵在於從題目給的數字鍵盤的位置 和 走馬步撥號的規則推導每個長度的撥號遞迴狀態轉移關係式

這一題和前面介紹過 計算有幾個母音直線排列 的那題很像,強烈建議一起複習有限狀態及FSM結合DP動態規劃的解題觀念。


Reference:

[1] Python O(n) by Finite State Machine [w/ Visualization] - Knight Dialer - LeetCode

avatar-img
88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 題目給我們一次做多的機會,也就是A交易日買進,B交易日賣出,請問最大獲利是多少?(此處不需要考慮現實面的交易稅、手續費...等因素) 如果無法獲利,則題目要求return 0。
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給我們一個陣列prices,裡面的數值代表每一個交易日的股票股價。 題目給我們一次做多的機會,也就是A交易日買進,B交易日賣出,請問最大獲利是多少?(此處不需要考慮現實面的交易稅、手續費...等因素) 如果無法獲利,則題目要求return 0。
題目會給定一組規則,要求我們計算給定長度下的母音直線排列有幾種?
這題算是路徑計數類的DP衍伸題(路徑數、方法數、組合數...等等這種枚舉類的題目,第一時間切入除了想到DFS+回溯法之外,也可以留意DP動態規劃解題的可能性) 題目會給我們一個指定長度為arrLen的陣列,起點從index=0開始出發,每次移動可以往左移一格,往右移一格,或是留在原地不
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
以前伯伯在其他診所做過活動假牙,不過吃東西的時候總覺得痛、沒辦法咬。這位伯伯找到許明翰醫師,想要有好用的活動假牙,就得改變三個問題。一、活動假牙的類型。彈性床活動假牙、金屬鉤活動假牙。二、歪斜的咬合平面。三、現有的牙齒要不要拔掉?關於活動假牙的心就比較、活動假牙的細節差異,請看這邊。
Thumbnail
依舊是舒服流暢且運鏡自然的導演功力,搭配巧妙穿插在不同世界的編劇場景 看著一幀幀動畫師全手工繪製的畫面,這就是宮崎駿《蒼鷺與少年》阿!! 我想說說我的心得體悟~在真實又殘酷的世界裡,我們無法阻止某些人的惡意 能守住的是自己的善意,用同理心去調節,用自己的姿態,好好活著。
Thumbnail
在日本找工作主要可以分成 1. 新卒採用:未畢業~畢業三年以內的人(各公司規定不同,要上官網確認) 2. キャリア採用(career採用):有工作經驗的人 我自己的經驗是「新卒採用」,所以以下會詳細講解新卒採用的流程等。 每年日本學生找工作都「必須」在同一個時期開始進行,一般的學生會在大三/
Thumbnail
探索自己的方式有很多,其中一種就是透過評量工具來認識自己。這次參加由Baiyan Global Consulting 創辦人暨執行長(Founder CEO) Sherry主講的MBTI工作坊,在雪力建立的安全場域內,正確的進行MBTI評量,認識最原始狀態的自己。本篇文章分享我為什麼想參加工作坊、工
Thumbnail
這是上週日參加朱騏的「卡片盒筆記讀書會」的心得記錄,一開始以為讀書會內容會跟書本內容有所重複,但相對的,比起照本宣科的分享,更多的是朱騏本人實作上的應用方式,並將作法拆分成細小的框架,透過拆解成小單位的學習,再自行組裝成自己可以應用的方法!收穫良多!
祈望大家繼續寫信,關心為香港獻身的獄中人,才能讓我們繼續走下去。
Thumbnail
每每發現某些區域又因為疫情關係導致管制措施重新被實施時,自己總第一個就聯想到相關產業的從業者又馬上陷入愁雲慘霧狀態。事實上這情形已經在身邊屢見不鮮,太多人都因此被迫失業轉行,甚至就在視野中消失了。(期待他們一切安好)
Thumbnail
簡報圖表動畫製作與運用的關鍵,在於「資訊密度」控管。簡報時必須謹守「投影片畫面一次只出現一個訊息」的原則,並與口語進行非常細部的配對,才能做到「無縫隙」的簡報境界,提高溝通效率。 一般而言,圖表動畫的製作可分成:表格、圖表及圖解化文字。由於人腦一次所能掌握的資訊量非常有限,因此不論是那一種形式的圖
Thumbnail
​ 在都市的角落常常可以看到破房子的廢墟,如果善加利用就能讓建築物有了新生命。台北市萬華區也有一個如此的廢墟再利用的破房子。柏林廢墟便是如此的建築物。這棟建築物代表的是自由、創意與藝術佔屋的精神。融合了場地租借可以舉辦各類型活動,這裡是個小酒吧,在廢墟中更能體驗廢墟的滄桑美感。 柏林廢墟相關資訊::
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
以前伯伯在其他診所做過活動假牙,不過吃東西的時候總覺得痛、沒辦法咬。這位伯伯找到許明翰醫師,想要有好用的活動假牙,就得改變三個問題。一、活動假牙的類型。彈性床活動假牙、金屬鉤活動假牙。二、歪斜的咬合平面。三、現有的牙齒要不要拔掉?關於活動假牙的心就比較、活動假牙的細節差異,請看這邊。
Thumbnail
依舊是舒服流暢且運鏡自然的導演功力,搭配巧妙穿插在不同世界的編劇場景 看著一幀幀動畫師全手工繪製的畫面,這就是宮崎駿《蒼鷺與少年》阿!! 我想說說我的心得體悟~在真實又殘酷的世界裡,我們無法阻止某些人的惡意 能守住的是自己的善意,用同理心去調節,用自己的姿態,好好活著。
Thumbnail
在日本找工作主要可以分成 1. 新卒採用:未畢業~畢業三年以內的人(各公司規定不同,要上官網確認) 2. キャリア採用(career採用):有工作經驗的人 我自己的經驗是「新卒採用」,所以以下會詳細講解新卒採用的流程等。 每年日本學生找工作都「必須」在同一個時期開始進行,一般的學生會在大三/
Thumbnail
探索自己的方式有很多,其中一種就是透過評量工具來認識自己。這次參加由Baiyan Global Consulting 創辦人暨執行長(Founder CEO) Sherry主講的MBTI工作坊,在雪力建立的安全場域內,正確的進行MBTI評量,認識最原始狀態的自己。本篇文章分享我為什麼想參加工作坊、工
Thumbnail
這是上週日參加朱騏的「卡片盒筆記讀書會」的心得記錄,一開始以為讀書會內容會跟書本內容有所重複,但相對的,比起照本宣科的分享,更多的是朱騏本人實作上的應用方式,並將作法拆分成細小的框架,透過拆解成小單位的學習,再自行組裝成自己可以應用的方法!收穫良多!
祈望大家繼續寫信,關心為香港獻身的獄中人,才能讓我們繼續走下去。
Thumbnail
每每發現某些區域又因為疫情關係導致管制措施重新被實施時,自己總第一個就聯想到相關產業的從業者又馬上陷入愁雲慘霧狀態。事實上這情形已經在身邊屢見不鮮,太多人都因此被迫失業轉行,甚至就在視野中消失了。(期待他們一切安好)
Thumbnail
簡報圖表動畫製作與運用的關鍵,在於「資訊密度」控管。簡報時必須謹守「投影片畫面一次只出現一個訊息」的原則,並與口語進行非常細部的配對,才能做到「無縫隙」的簡報境界,提高溝通效率。 一般而言,圖表動畫的製作可分成:表格、圖表及圖解化文字。由於人腦一次所能掌握的資訊量非常有限,因此不論是那一種形式的圖
Thumbnail
​ 在都市的角落常常可以看到破房子的廢墟,如果善加利用就能讓建築物有了新生命。台北市萬華區也有一個如此的廢墟再利用的破房子。柏林廢墟便是如此的建築物。這棟建築物代表的是自由、創意與藝術佔屋的精神。融合了場地租借可以舉辦各類型活動,這裡是個小酒吧,在廢墟中更能體驗廢墟的滄桑美感。 柏林廢墟相關資訊::