0代表是燈滅的,1代表打開
對於每次操作都有兩種情況,燈滅或者燈開,所以每次都要取最小
最後再把關的狀態時的最小值輸出
How to Type
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3780 Accepted Submission(s): 1735
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <ctype.h>
#include <string.h>
#include <string>
#include <limits.h>
#include <math.h>
#include <limits.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <deque>
#include <vector>
#include <set>
#include <map>
using namespace std;
#define INF 999999
int dp[2][122];
int Min(int a,int b){
return a<b?a:b;
}
bool daxie(char c){
if(c>='A' && c<='Z'){
return true;
}
else{
return false;
}
}
int main(){
int t;
char s[111];
scanf("%d",&t);
while(t--){
scanf("%s",&s);
int len = strlen(s);
dp[0][0] = 0;//0沒有開大寫
dp[1][0] = INF;//1開了大寫
int i;
for(i=1;i<=len;i++){
if(daxie(s[i-1]) == true){//大寫
dp[0][i] = Min(dp[0][i-1]+2,dp[1][i-1]+2);//前面的燈是滅的,要寫大寫,則需要shift。後面那個是輸入好了之後再把燈滅掉
dp[1][i] = Min(dp[0][i-1]+2,dp[1][i-1]+1);
}
else{//小寫
dp[0][i] = Min(dp[0][i-1]+1,dp[1][i-1]+2);
dp[1][i] = Min(dp[0][i-1]+2,dp[1][i-1]+2);
}
}
printf("%d\n",dp[0][len]);//最後是要燈滅的。
}
return 0;
}