• http://www.bubuko.com/infodetail-640153.html
  •  题意
    • 给出一个字符串,有大写有小写,问最少的按键次数。然后打字的这个人有一个习惯,打完所有的字之后,指示灯要关闭。
    • 过程中可以打开或者关闭大写键,也可以按一次shift打一个大写转小写或者小写转大写的字母
  • 题解
    • dp[i][j]表示打到第i个字母,j有0,1两个值表示指示灯开或者关的状态
    • 技术分享
    • 然后就可以写出状态转移方程了,因为最后需要灯是灭的,所以最后在找最小值的时候,dp[len][1]需要加1
  • 代码
    • #include <stdio.h>
      #include <algorithm>
      #include <string.h>
      #include <iostream>
      #include <cmath>
      #include <queue>
      #include <ctype.h>
      using namespace std;
      #define INF 1000
      #define MAXN 110
      char a[MAXN];
      int on[MAXN],off[MAXN];//on代表当前大写锁定打开,off代表当前大写锁定关闭
      int main()
      {
          int t;
          cin>>t;
          getchar();
          while(t--)
          {
              scanf("%s",a+1);
              int n=strlen(a+1);
              on[0]=1;//要打开大写锁定,所以初始值为1
              off[0]=0;
              for(int i=1;i<=n;i++)
              {
                  if(isupper(a[i]))//如果当前所输为大写字母
                  {
                      on[i]=min(on[i-1]+1,off[i-1]+2);
                      //要使得输完之后大写锁开着
                      //如果是大写锁定打开,则直接+1,如果大写锁定关闭,则得先打开大写锁定,再输入字母,所以+2.
                      off[i]=min(on[i-1]+2,off[i-1]+2);//同理
                  }
                  else
                  {
                      on[i]=min(on[i-1]+2,off[i-1]+2);//同理
                      off[i]=min(on[i-1]+2,off[i-1]+1);//同理
                  }
              }
              printf("%d\n",min(on[n]+1,off[n]));
          }
      }

发表评论

邮箱地址不会被公开。 必填项已用*标注