标签:dp
3 Pirates HDUacm HDUACM
8 8 8HintThe string “Pirates”, can type this way, Shift, p, i, r, a, t, e, s, the answer is 8. The string “HDUacm”, can type this way, Caps lock, h, d, u, Caps lock, a, c, m, the answer is 8 The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8
DP题,设dp[i][0]表示当打印第i个字符时大写未锁定,dp[i][1]表示打印第i个字符时大写锁定
如果第i个字符是大写字母
dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + 2;
dp[i][1] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 1);
如果第i个字符是小写字母
dp[i][0] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + 2;
初始化dp[0][0] = 0,dp[0][1] = 1;
最后输出min(dp[n][0], dp[n][1] + 1)
#include <map> #include <set> #include <list> #include <queue> #include <stack> #include <vector> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int inf = 0x3f3f3f3f; int dp[120][2]; char str[120]; int main() { int t; scanf("%d", &t); while(t--) { scanf("%s", str); int n = strlen(str); memset (dp, inf, sizeof(dp)); dp[0][0] = 0; dp[0][1] = 1; for (int i = 1; i <= n; i++) { if (str[i - 1] >= 'A' && str[i - 1] <= 'Z') { dp[i][0] = min(dp[i - 1][0], dp[i - 1][1]) + 2; dp[i][1] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 1); } else { dp[i][0] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 2); dp[i][1] = min(dp[i - 1][0], dp[i - 1][1]) + 2; } } printf("%d\n", min(dp[n][0], dp[n][1] + 1)); } return 0; }
标签:dp
原文地址:http://blog.csdn.net/guard_mine/article/details/41381201