题目分析
题意
输入数据的组数t,每组是一行包含大写字母和小写字母的字符串,求键入此字符串的最少按键次数。完成键入后,CapsLK键必须是关闭的。
思路
用子问题定义状态,dpo[M]表示结束后CapsLK键为为开启状态,键入长度为M字符串的最少按键次数,dpc[M]表示结束后CapsLK键为关闭状态,键入长度为M字符串的最少按键次数。最后dpo[M]要+1。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define M 103
char a[M];
int dpc[M],dpo[M];
int main(){
//freopen("data.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
getchar();
scanf("%s",a);
memset(dpo,0,sizeof(dpo));
memset(dpc,0,sizeof(dpc));
//dpc[0]=0;
dpo[0]=1;//最后CapsLK键必须是关闭的,所以+1
int len=strlen(a);
for(int i=0;i<len;i++){
if(a[i]>='a'&&a[i]<='z'){//键入小写字母
dpc[i+1]=min(dpc[i]+1,dpo[i]+2);//dpo[i]+2表示键入i个字符结束后CapsLK键开启下的最少键次,按1个字符,按CapsLK键
dpo[i+1]=min(dpc[i]+2,dpo[i]+2);//dpo[i]+2表示 键入i个字符结束后CapsLK键开启下的最少键次,按Shift键,按1个字符
}
else{
dpc[i+1]=min(dpc[i]+2,dpo[i]+2);
dpo[i+1]=min(dpc[i]+2,dpo[i]+1);
}
}
dpo[len]++;
printf("%d\n",min(dpo[len],dpc[len]));
}
return 0;
}