題目描述:
給出一個字母序列,從非大寫鎖定狀態開始,敲完這個字母串,以非大寫鎖定狀態結束,問最少按鍵盤的次數。
大致思路:
狀態很好判斷,定義dp[i][1]和dp[i][0]分別表示完成前i位鍵盤處於大寫鎖定狀態和非大寫鎖定狀態的最少操作次數。然後每次計算的時候從dp[i-1][0]和dp[i-1][1]轉移即可。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[110][2];
int main() {
int T;
cin>>T;
while (T--) {
char a[110];
scanf("%s",a);
memset(dp,0,sizeof(dp));
dp[0][1] = 1;
int l = strlen(a);
for (int i = 0; i < l; i++) {
if (a[i] <= 'z' && a[i] >= 'a') {
dp[i+1][0] = min(dp[i][0]+1,dp[i][1]+2);
dp[i+1][1] = min(dp[i][1]+2,dp[i][0]+2);
}
else {
dp[i+1][0] = min(dp[i][0]+2,dp[i][1]+2);
dp[i+1][1] = min(dp[i][0]+2,dp[i][1]+1);
}
}
cout<<min(dp[l][0],dp[l][1]+1)<<endl;
}
}