首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

HDU 1198 / How to Type:大小寫切換最少按鍵次數 DP 解法

     編輯:程式設計疑難解答

題目大意

輸入一個字符串(大小寫字母),鍵盤有 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 解析

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved