题目意思不难理解。注意点就是 caslock开启后 安shift+字母键可写出小写。
这里主要就是 在何时开启caslock键和关闭caslock键。
所以我们设 d[i][caslock]表示 caslock键在第i个字符时的状态是caslock(未开启为0,开启为1)时,打完后序字符所需要的按键次数。
则根据当前是否是 小写字母 和打完之后是否关闭caslock键来决定状态的转移。转移比较简单,理清关系就好。
//
// main.cpp
// hdu 2577 How to Type
#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
char s[110] ;
int len ;
int d[110][2] ;
int min(int i, int j)
{
return i > j ?j:i ;
}
int getNum(int i , int caslock){
if (i ==len) {
return caslock ;
}else{
int& ans = d[i][caslock] ;
if(ans >= 0 )
{
return d[i][caslock] ;
}
else{
if (caslock == 0 ) {
if (s[i] >='a' &&s[i]<='z') {
ans = 1 +getNum(i+1, 0) ;
}
else{
ans = 2 + getNum(i+1, 0) ;
ans =min(ans, min(2 + getNum(i+1, 1) , 3 + getNum(i+1, 0)) );
}
}
else{
if (s[i] >='a' &&s[i]<='z') {
ans = 2 +getNum(i+1, 1) ;
ans = min(ans , 3 + getNum(i+1, 0)) ;
}
else{
ans = min(1 + getNum(i+1, 1) , 2 + getNum(i+1, 0)) ;
}
}
}
return ans ;
}
}
int main(int argc, const char * argv[]) {
int T ; scanf("%d" ,&T) ;
while (T--) {
scanf("%s" ,s) ;
len = (int )strlen(s) ;
memset(d, -1, sizeof(d)) ;
cout<<getNum(0 ,0)<<endl;
}
return 0;
}