题目链接:传送门
分析:题意大概是打一段字符串,可以用cap locks键,也可以用shift键加字母键,最后得保证cap lock键是关闭的
思路:第一眼知道是DP,然而却不知道怎么找状态方程,看了网上题解后,大概就是定义两个数组表示两个状态,一个状态是关了cap键,一个是开着。
AC代码:
#include<cstdio> //头文件模板
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
int main(){
char ch[105];
int a[105],A[105];
int t;
cin>>t;
while(t--){
scanf("%s",ch+1); //字符串从1开始输入
memset(a,0,sizeof(a));
memset(A,0,sizeof(A));
a[0]=0; A[0]=1; //定义初始状态
int i;
for(i=1;ch[i];i++){
if(ch[i]>='a'&&ch[i]<='z'){//当输入小写时
a[i]=min(a[i-1]+1,A[i-1]+2);//下一个是关闭状态;
//若前一个状态时小写,就只用加1
//若前一个状态是大写键,选择shift+字母键
A[i]=min(a[i-1]+2,A[i-1]+2); //下一个是cap开启状态
//若前一个状态是小写,就把caps开启,再输入字母
//若前一个状态是大写状态,就shift+字母键
//下面同理
}
if(ch[i]>='A'&&ch[i]<='Z'){
a[i]=min(a[i-1]+2,A[i-1]+2);
A[i]=min(a[i-1]+2,A[i-1]+1);
}
}
int num;
num=min(a[i-1],A[i-1]+1);
cout<<num<<endl;
}
}