题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577
思路:动态规划(dp)
令a[i]为输入第i个字符后CapsLock打开状态,b[i]关闭;则有如下:
1)若第i个字符为小写
(之前状态转移至当今状态)
a[i]=min(a[i-1]+2,b[i-1]+2) ; 开:shift+字符; 关:字符+CapsLock;
b[i]=min(a[i-1]+2,b[i-1]+1) ; 开:CapsLock+字符; 关:字符;
2)大写
a[i]=min(a[i-1]+1,b[i-1]+2) ; 开:字符; 关:CapsLock+字符;
b[i]=min(a[i-1]+2;b[i-1]+2) ; 开:字符+CapsLock; 关:shift+字符;
#include<stdio.h>
#include<string.h>
#define min(a,b) (a)<(b)?(a):(b)
int a[103],b[103];
int main()
{
int t,i,len;
char ch[103];
scanf("%d",&t);
while(t--)
{
scanf("%s",ch);
len=strlen(ch);
a[0]=1;b[0]=0;
for(i=0;i<len;i++)
{
if(ch[i]>='a'&&ch[i]<='z')
{
a[i+1]=min(a[i]+2,b[i]+2);
b[i+1]=min(a[i]+2,b[i]+1);
}
else
{
a[i+1]=min(a[i]+1,b[i]+2);
b[i+1]=min(a[i]+2,b[i]+2);
}
}
a[len]++;
printf("%d\n", min(a[len],b[len]));
}
return 0;
}