点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=2577
题目意思求出操作次数最小?最少只要多少次就可以输完一串字符!!
这里唯一要注意就是要考虑是否开(Capslock)是否关,,什么时候开启,怎样开启!到哪了关闭!最后是否关闭?
这里也就要分别用两个数组来保存开/关次数。并且最终判断出开关哪个用的次数最少!!
具体见代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[1005];
int b[1005];
char str[105];
int main()
{
int i,j,n;
scanf("%d",&n);
while(n--)
{
scanf("%s",&str);
int len=strlen(str);
// memset(a,0,sizeof(a));
// memset(b,0,sizeof(b));
a[0]=0;b[0]=1;//当第一个字符大写是就Capslock,所以就为b[0]=1,否则就不打开Casplock,a[0]=0;
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='a'&&str[i]<='z')
{
a[i+1]=min(a[i],b[i]+2);//当第i个字符为小写时就直接接不要改变,或者开始加了(capslock)则就要b[i]+2;(开关)。
b[i+1]=min(a[i]+1,b[i]+1);//如果要是开了,则每一次加+1;
}
else if(str[i]>='A'&&str[i]<='Z')
{
a[i+1]=min(a[i]+1,b[i]+1);//若当i个字符为大写时,若一开始为没开,则每一个就加1,
b[i+1]=min(a[i]+2,b[i]);//若一开始开了,则只有变为小写,则每一个都加+2;
}
// b[len-1]++;
}
int ans=min(b[len]+1,a[len]); //最后一个为关,则加1;
printf("%d\n",ans+len);
}
return 0;
}