题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2577
题目描述:
要求一个字符串输入,求按键盘的最少次数。有Caps Lock和Shift两种转换大小写输入的方式
解题思路:
保存大写和小写两种状态,和上篇雇佣员工逻辑一样,当前字符虽然是大写,不过也可能利用小写+shift实现。
假设我们当前字符i需要大写:对于i输入完后,有两种状态,一种是大写,一种是小写。
输入完大写字符i后继续保持大写的状态可以由①原输入为大写,写一个字符即可,b[i][1]+1 ②原输入为小写,按shift+字符,b[i][0]+2
输入完大写字符i后继续保持大小的状态可以由①原输入为大写,切换后写一个字符即可,b[i][1]+2 ②原输入为小写,写一个字符即可,b[i][0]+1
#include<string.h>
#include<stdio.h>
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int b[101][2];
char a[10010];
int n,i,l;
scanf("%d",&n);
getchar();
while(n--)
{
gets(a);
b[0][0]=0;
b[0][1]=1;
for(i=0;a[i]!='\0';i++)
{
if(a[i]>='A'&&a[i]<='Z') //如果需求大写
{
b[i+1][1]=min(b[i][0]+2,b[i][1]+1);//写完是大写的状态
b[i+1][0]=min(b[i][0]+2,b[i][1]+2);//写完是小写的状态
}
else //如果需求小写
{
b[i+1][1]=min(b[i][0]+2,b[i][1]+2);
b[i+1][0]=min(b[i][0]+1,b[i][1]+2);
}
}
l=min(b[i][1]+1,b[i][0]);
printf("%d\n",l);
}
return 0;
}