題目大意
輸入一個字符串(大小寫字母),鍵盤有 CapsLock 鍵。輸入大寫可按 Shift+字母 或 開啟 CapsLock 再按字母。要求 CapsLock 結束時必須關閉。求最少按鍵次數。
DP 狀態
`dp[i][0/1]`:處理前 i 個字符,CapsLock 狀態為關/開 的最少按鍵數。
初始 `dp[0][0]=0, dp[0][1]=INF`(開始時 CapsLock 關)。
轉移
- 當前字符 `ch`:
- 若小寫:
`dp[i][0] = min(dp[i-1][0]+1, dp[i-1][1]+2)` (保持關 / 關閉 CapsLock 再按)
`dp[i][1] = min(dp[i-1][1]+1, dp[i-1][0]+2)` (保持開 / 開啟 CapsLock 再按)
- 若大寫:
`dp[i][0] = min(dp[i-1][0]+2, dp[i-1][1]+1)` (Shift+字母 / CapsLock 開啟狀態直接按)
`dp[i][1] = min(dp[i-1][1]+2, dp[i-1][0]+1)` (Shift+字母 / 開啟 CapsLock 後按)
答案
`min(dp[n][0], dp[n][1]+1)` (結尾若 CapsLock 開需額外 1 次關閉)。
樣例驗證
- `Pirates` → 8
- `HDUacm` → 8
- `HDUACM` → 8
參考題解
libin56842 詳細 DP 解析