原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577
海盗已经完成了打字软件的开发。
他打电话给凯茜测试他的打字软件。
她善于思考。
经过几天的测试,她发现如果她通过某种方式键入字符串,她至少会输入密钥。
但她有一个坏习惯,即如果打开大写锁定,她必须在完成打字后关掉它。
现在,她想知道键入键的最小时间,以完成键入字符串。
输入
第一行是整数t(t <= 100),它是输入文件中的测试用例数。
对于每个测试用例,只有一个字符串由小写字母和大写字母组成。
字符串的长度最多为100。
产量
对于每个测试用例,必须输出键入键的最小次数才能完成键入此字符串。
Sample Input
3
Pirates
HDUacm
HDUACM
Sample Output
8
8
8
暗示
字符串“Pirates”,可以这样输入,Shift,p,i,r,a,t,e,s,答案是8。
字符串“HDUacm”,可以这样输入,大写锁定,h,d,u,大写锁定,a,c,m,答案是8
字符串“HDUACM”,可以这样输入大写锁定h,d,u,a,c,m,大写锁定,答案是8斜体样式
ac代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
using namespace std;
int const MAX = 105;
char s[MAX];
int dp[MAX][2];
bool judge(char ch)
{
if (ch >= 'A' && ch <= 'Z')
return true;
return false;
}
int main()
{
int T;
cin>>T;
while (T--)
{
scanf("%s", s + 1);
int len = strlen(s + 1);
memset(dp, 0, sizeof(dp));
dp[0][1] = 1;
for (int i = 1; i <= len; i++)
{
if (judge(s[i]))
{
dp[i][1] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 2);
dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
}
else
{
dp[i][1] = dp[i - 1][1] + 2;
dp[i][0] = dp[i - 1][0] + 1;
}
}
printf("%d\n", min(dp[len][0], dp[len][1] + 1));
}
}