#44168: 看網上沒人這樣寫,所以我講講看我的解法


s10900156@nhsh.tp.edu.tw (ShanC)

學校 : 臺北市立內湖高級中學
編號 : 138785
來源 : [118.167.202.23]
最後登入時間 :
2024-11-29 20:43:48
c560. SF 愛運動 | From: [118.167.226.139] | 發表日期 : 2024-11-08 23:20

首先,很直覺的可以觀察到轉移式: 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]
整個轉移式又會是這樣: 

dp[i] = dp[i - 1] + dp[i - 3] * (!rest[i - 2] && !rest[i - 1]) if i > 2
dp[i] = 1                                                                             if 0 <= i <= 2
 
 
又水了一題
 
ZeroJudge Forum