hdu 2577 How to Type--记忆化搜索

题目意思不难理解。注意点就是  caslock开启后 安shift+字母键可写出小写。

这里主要就是 在何时开启caslock键和关闭caslock键。

所以我们设  d[i][caslock]表示 caslock键在第i个字符时的状态是caslock(未开启为0,开启为1)时,打完后序字符所需要的按键次数。

则根据当前是否是 小写字母 和打完之后是否关闭caslock键来决定状态的转移。转移比较简单,理清关系就好。

//
//  main.cpp
//  hdu 2577 How to Type


#include <iostream>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
char s[110] ;
int len  ;
int d[110][2] ;
int min(int i,  int j)
{
    return i > j ?j:i ;
}
int getNum(int i , int caslock){
    if (i ==len) {
        return caslock ;
    }else{
        int& ans = d[i][caslock] ;
        if(ans >= 0  )
        {
            return d[i][caslock] ;
        }
        else{
            if (caslock == 0 ) {
                if (s[i] >='a' &&s[i]<='z') {
                    ans = 1 +getNum(i+1, 0) ;
                }
                else{
                    ans = 2 + getNum(i+1, 0) ;
                    ans =min(ans,  min(2 + getNum(i+1, 1) , 3 + getNum(i+1, 0)) );
                }
            }
            else{
                if (s[i] >='a' &&s[i]<='z') {
                    ans = 2 +getNum(i+1, 1) ;
                    ans = min(ans , 3 + getNum(i+1, 0)) ;
                }
                else{
                    ans = min(1 + getNum(i+1, 1)  , 2 + getNum(i+1, 0)) ;
                }
            }
        }
        return ans ;
    }
}
int main(int argc, const char * argv[]) {
     int T ; scanf("%d" ,&T) ;
    while (T--) {
        scanf("%s" ,s) ;
         len = (int )strlen(s) ;
        memset(d, -1, sizeof(d)) ;
        cout<<getNum(0 ,0)<<endl;
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值