動態規劃之簡單遞推——hdu2577

題目描述:

給出一個字母序列,從非大寫鎖定狀態開始,敲完這個字母串,以非大寫鎖定狀態結束,問最少按鍵盤的次數。

大致思路:

狀態很好判斷,定義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;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章