【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)
生活随笔
收集整理的這篇文章主要介紹了
【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 代碼 & 思路
- 1. 二維數組(方便理解)
- 2. 一維數組(節約空間)
- 二刷
鴿了好久的打題博客~要繼續補起來了!
今天不打題,明天變垃圾 QAQ
題目描述
- 一眼就想先暴力枚舉、或者遞歸呀~但是貌似會超時,這里就直接用dp了
- 參考題解
- 主要思路有點像跳臺階,也就是用上一輪次的和,來維護當前輪次的值
代碼 & 思路
1. 二維數組(方便理解)
- 舉個例子吧:兩個骰子得出來的值8,相當于:
- 一個骰子的2,再補上另一個的6
- 一個骰子的3,再補上另一個的5
- 一個骰子的4,再補上另一個的4
- 一個骰子的5,再補上另一個的3
- 一個骰子的6,再補上另一個的2
- 當然,一個骰子的1,再補上另一個的7 這種情況是不存在的,所以只有5種情況可行。
也就是說 dp[2][8] = dp[1][2] + dp[1][3] + dp[1][4] + dp[1][5]+ dp[1][6] - 按照這么一個思路,我們就可以得出下面的代碼:
2. 一維數組(節約空間)
- 在上一個方法的基礎上,我們知道:第 n 輪的值,只和第 n - 1 輪的值相關
- (還是得去上面鏈接的題解結合動圖理解)
- 經過思考,可以發現其實按照從后往前的順序進行數組更新,就只需要一維數組即可:
- 舉個例子(實際還是1維,這里的行值是輔助了解當前狀態):
- dp[2][12] = dp[1][11] + dp[1][10] + … + dp[1][6]
- dp[2][11] = dp[1][10] + dp[1][9] + … + dp[1][5]
- …
- dp[2][2] = dp[1][1]
- 這也就是需要從后往前的原因,如果從前往后的話,dp[2][12]就取不到dp[1][11]的值了。從后往前可以實現無后效性~
- 那么進行一個空間上的優化,可以得到以下代碼:
二刷
- O(n2n^2n2)、O(n2n^2n2)
- O(n2n^2n2)、O(nnn)
總結
以上是生活随笔為你收集整理的【LeetCode笔记】剑指 Offer 60. n个骰子的点数(Java、动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 先学python还是ros_ROS入门学
- 下一篇: java velocity是什么意思_基