hdu 2577 How to Type

62 篇文章 0 订阅

题目源2577

times[i][0] 表示输入字符i后,大写键是关闭状态;times[i][1]:表示输入字符i后大写键是开启状态;

times[i][0]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;同样times[i][1]:是由times[i-1][0]和times[i-1][1]两种可能的状态决定的;

如果如入第i个字符是大写字母则:

times[i][0] = min{times[i-1][0] + 2, times[i][1] + 2};

times[i][1] = min{times[i-1][0] + 2, times[i-1][1] + 1};

如果如入第i个字符是小写字母则:

times[i][0] = min{times[i-1][0] + 1, times[i][1] + 2};

times[i][1] = min{times[i-1][0] + 2, times[i-1][1] + 2};

Len 表示字符串的长度,由于在最后输入结束大写键要处于关闭状态,因此最后times[Len][1] += 1;

 

 

代码如下:

#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

#define MIN(a, b) (a > b ? b : a)

const int MAXN = 110;
char str[MAXN];
int times[MAXN][2];

bool CheckCapital( char s )
{
     if(s >= 'A' && s <= 'Z')
          return true;
     else
          return false;
}
void count()
{
     int Len;
     int ans = 0;
     Len = strlen( str );
     memset(times, 0, sizeof(times));
     times[0][1] = 1;
     for(int i = 1; i <= Len; ++i)
     {
          if(CheckCapital(str[i-1]))
          {
               times[i][0] = MIN(times[i-1][0] + 2, times[i-1][1] + 2);
               times[i][1] = MIN(times[i-1][0] + 2,times[i-1][1] + 1);
          }
          else
          {
               times[i][0] = MIN(times[i-1][0] + 1, times[i-1][1] + 2);
               times[i][1] = MIN(times[i-1][0] + 2,times[i-1][1] + 2);
          }
     }
     times[Len][1] += 1;
     ans = MIN(times[Len][0],times[Len][1]);
     cout<<ans<<endl;
}
int main()
{
     int N;
     cin>>N;
     while(N--)
     {
          cin>>str;
          count();
     }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值