海盗们已经完成了打字软件的开发。他打电话给凯西测试他的打字软件。她善于思
考。在测试了几天之后,她发现如果她用某种方式键入字符串,她至少会键入关键
字。但她有一个坏习惯,如果大写锁定锁上了,她必须关掉它,在她完成打字之后。现在,她想知道键入字符串的关键字的最小时间。
输入
第一行是整数t(t <= 100),这是输入文件中的测试用例的数量。对于每个测试用例,只有一个字符串由小写字母和大写字母组成。字符串的长度最多为100。
输出
对于每个测试用例,您必须输出输入关键字的最小时间,以完成键入该字符串。
样例输入
3
Pirates
HDUacm
HDUACM
样例输出
8
8
8
这题先要开两个数组,分别保存关灯a和开灯b时打印第i个字母所需的最小步骤。
当第i个字母为小写字母时:a[i]=min(a[i-1]+1,b[i-1]+2):本来就为关灯时,只需按下该字母,本来为开灯时,需要关灯后按下字母。
b[i]=min(a[i-1]+2,b[i-1]+2):本来为关灯时,需按下字母后开灯,本来为开灯时,需按下shift+字母键(比关灯,按下字母键,开灯步骤少)。
当第i个字母为大写字母时:a[i]=min(a[i-1]+2,b[i-1]+2);b[i]=min(a[i-1]+2,b[i-1]+1);(同样的方式分析就可以)
最后还要b[len-1]++;(关灯)
注:开灯为打开大写锁定;关灯为关闭大写锁定。
#include
#include
#include
#include
using namespace std;
int main()
{
int t;
char s1[120];
int a[120],b[120];
int sum,num;
int i,j,len;
int flag;
scanf("%d",&t);
while(t--)
{
scanf("%s",s1);
sum=0;
len=strlen(s1);
if(s1[0]>='a'&&s1[0]<='z')
{
a[0]=1;
b[0]=2;
}
else
{
a[0]=2;
b[0]=2;
}
for(i=1;i
='a'&&s1[i]<='z')) { a[i]=min(a[i-1]+1,b[i-1]+2); b[i]=min(a[i-1]+2,b[i-1]+2); } else { a[i]=min(a[i-1]+2,b[i-1]+2); b[i]=min(a[i-1]+2,b[i-1]+1); } } b[len-1]++; printf("%d\n",min(a[len-1],b[len-1])); } return 0; }