hdu2577 How to Type

来源:互联网 发布:glide加载网络图片 编辑:程序博客网 时间:2024/04/25 00:01

题目链接: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 102int 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;}


原创粉丝点击