首先,很直覺的可以觀察到轉移式: dp[i] = dp[i - 1] + dp[i - 3]
因為第 i 階一定是從第 i - 1 階或第 i - 3 階跳上來
但這會有一個問題,我們分兩個狀況來討論:
從 i - 1 跳上來當然沒問題,第 i - 1 階與第 i 階之間沒有其他階梯,因為任兩連續整數之間不會有其他整數
從 i - 3 則可能會跳過位於第 i - 1 階的休息站,或是跳過位於第 i - 2 階的休息站,如下圖
因此很直觀的可以想到「要是沒有跳過休息站,才可以跳 3 階」
也因此需要一個布林陣列 rest[ ] 紀錄哪裡有休息站,有就紀錄 true
在每一次 dp 轉移的時候要先判斷 (!rest[i - 2] && !rest[i - 1]),如果是 true 就是 dp[i - 1] + dp[i - 3],否則 dp[i - 1]
整個轉移式又會是這樣: