题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577
题解:dp[i][0]存放当前是小写状态,dp[i][1]存放当前是大写的状态。
小写字母可在caps lock不亮时打出,也可在caps lock亮时,按shift打出
大写字母可在caps lock亮时打出,也可在caps lock不亮时,按shift打出
最后要保持关灯状态!!!!
输入小写字母:状态转移方程(分析如下)
dp[i+1][0]=Min(dp[i][0]+1,dp[i][1]+2);//如果输入前一个字母灯是灭的(caps lock关闭),1.只需按所要输入的字母即可;2.按shift+字母
dp[i+1][1]=Min(dp[i][0]+2,dp[i][1]+2);//如果输入前一个字母灯是亮的(caps lock打开),1.按caps lock+字母;2.按shfit+字母
输入大写字母:状态转移方程
dp[i+1][0]=Min(dp[i][0]+2,dp[i][1]+2);//如果输入前一个字母灯是灭的(caps lock关闭), 1.按caps lock+字母;2.按shfit+字母
dp[i+1][1]=Min(dp[i][0]+2,dp[i][1]+1);//如果输入前一个字母灯是亮的(caps lock打开),1.只需按所要输入的字母即可;2.按shfit+字母
#include <stdio.h>
#include <string.h>
#define MAXN 102
int dp[MAXN][2];
int Min(int x,int y)
{
return x<y?x:y;
}
int main()
{
int n,i,len,ans;
char str[MAXN];
scanf("%d",&n);
while(n--)
{
memset(dp,0,sizeof(dp));
scanf("%s",str);
len=strlen(str);
dp[0][1]=1;//0个字母大写状态一次按键
for(i=0;i<len;++i)
{
if(str[i]>='a'&&str[i]<='z')
{
dp[i+1][0]=Min(dp[i][0]+1,dp[i][1]+2);
dp[i+1][1]=Min(dp[i][0]+2,dp[i][1]+2);
}
else
{
dp[i+1][0]=Min(dp[i][0]+2,dp[i][1]+2);
dp[i+1][1]=Min(dp[i][0]+2,dp[i][1]+1);
}
}
ans=Min(dp[len][0],dp[len][1]+1);//dp[len][1]+1表示turn off caps lock
printf("%d\n",ans);
}
return 0;
}