HDU 2577 How to Type (线性dp)

How to Type

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4616    Accepted Submission(s): 2084

Problem Description

Pirates have finished developing the typing software. He called Cathy to test his typing software. She is good at thinking. After testing for several days, she finds that if she types a string by some
ways, she will type the key at least. But she has a bad habit that if the caps lock is on, she must turn off it, after she finishes typing. Now she wants to know the smallest times of typing the key to finish typing a string.

Input

The first line is an integer t (t<=100), which is the number of test case in the input file. For each test case, there is only one string which consists of lowercase letter and upper case letter. The length
of the string is at most 100.

Output

For each test case, you must output the smallest times of typing the key to finish typing this string.

Sample Input

3
Pirates
HDUacm
HDUACM

Sample Output

8
8
8

Hint

The string “Pirates”, can type this way, Shift, p, i, r, a, t, e, s, the answer is 8.
The string “HDUacm”, can type this way, Caps lock, h, d, u, Caps lock, a, c, m, the answer is 8
The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8


 

Author

Dellenge

Source

HDU 2009-5 Programming Contest

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577

题目大意:坑比题,给一些有大小写组成的字符串,问用键盘打出它们的最少按键次数

按键规则:对于每一个小写字母,加上shift可使其变成大写,注意shift不可以一直按着不放,还可以开大写锁Caps lock键,按完这键输入就变成大写,此时再按shift,则打出小写(mac的键盘貌似不是这样),注意每次大写锁,最后必须把它关上

题目分析:知道题以后就很简单了dp[i][0]和dp[i][1]分别表示到第i个字符大写锁关,开着时要按的最少次数,则有4种情况

如果到第i个字符为小写且此时开着大写锁,则它前一个必然是大写,因为如果前一个是小写,当前也是小写,我显然不需要开大写锁

dp[i][1] = dp[i - 1][1] + 2

如果到第i个字符为小写且此时没开大写锁,直接打就行了

dp[i][0] = dp[i - 1][0] + 1

如果到第i个字符为大写且此时开着大写锁,则为前一个开着大写锁的情况加1和前一个没开大写锁的情况加2的最小值,表示开锁

dp[i][1] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 2)

如果到第i个字符为大写且此时没开大写锁,则为前一个没开大写锁的情况加2(按shift)和前一个开着大写锁的情况加2的最小值,表示关锁

dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int const MAX = 105;
char s[MAX];
int dp[MAX][2];

bool judge(char ch)
{
    if(ch >= 'A' && ch <= 'Z')
        return true;
    return false;
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s", s + 1);
        int len = strlen(s + 1);
        memset(dp,0, sizeof(dp));
        dp[0][1] =  1;
        for(int i = 1; i <= len; i++)
        {
            if(judge(s[i]))
            {
                dp[i][1] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 2);
                dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
            }
            else
            {
                dp[i][1] = dp[i - 1][1] + 2;
                dp[i][0] = dp[i - 1][0] + 1;
            }
        }
        printf("%d\n", min(dp[len][0], dp[len][1] + 1));
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 15:45:56

HDU 2577 How to Type (线性dp)的相关文章

HDU 2577 How to Type(dp题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577 解题报告:有一个长度在100以内的字符串,并且这个字符串只有大写和小写字母组成,现在要把这些字符串用键盘输入到电脑中,一开始的时候大写锁定是关闭的,并且要求结束的时候也是关闭的,然后让你求输入这些字符串最少需要按多少次键盘(包括Cap Lock键和Shift键) 一个典型的dp题,定义一个一维数组就够了,然后dp[i]的含义的输入到第i个字符时需要按键的最少次数.然后递推公式如下: dp[i]

HDU 2577 How to Type【DP】

题意:给出一个字符串,有大写有小写,问最少的按键次数.然后打字的这个人有一个习惯,打完所有的字之后,指示灯要关闭. dp[i][j]表示打到第i个字母,j有0,1两个值表示指示灯开或者关的状态 然后就可以写出状态转移方程了,因为最后需要灯是灭的,所以最后在找最小值的时候,dp[len][1]需要加1 又一次看的题解===go--go 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #includ

hdu 2577 How to Type(dp)

题意: 输入一行字符串 只包含大小写字母 可以使用shift 和 caps 键 切换大小写 问最少按几次键 思路: if(str[i]>='A'&&str[i]<='Z') { dp[i][0]=min(dp[i-1][0]+1,dp[i-1][1]+2);//on dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2);//off } else { dp[i][0]=min(dp[i-1][0]+2,dp[i-1][1]+2); dp[i][1]=mi

HDU 2577 How to Type(模拟)

题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2577 题意   给你一个由大写字母和小写字母组成的字符串  模拟键盘输入的最少按键次数 直接模拟每个字符的输入  flag表示capslock的状态  1表示打开  0为关闭  开始是和输入完毕都是关闭的关闭的  用plu记录shift和capslock的按键次数 当接下来输入的字母有连续n个跟capslock状态不同时  分析可只  只有n=1时适合用shift键 如flag=1 n=1  输入

HDU 2577 How to Type (DP,经典)

题意:打字游戏,求所按的最少次数.给出一个串,其中有大小写,大写需要按下cap键切换到大写,或者在小写状态下按shift+键,这样算两次,打小写时则相反.注意:在打完所有字后,如果cap键是开着的,要关它,也就是要算多一次. 思路:DP,根据每个字符打完后cap键盘是开着的还是关着的,最后dp[最后一个字符][关着的]为答案.规模降低到1个字符,每次考虑增加一个字符,打这个字符有两种选择,从上一个字符打完后的cap键关/开的两种状态来按下此字符,按完此字符后考虑使cap键开着或者关掉. dp[当

hdu 2577 How to Type

传送门 How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5452    Accepted Submission(s): 2436 Problem Description Pirates have finished developing the typing software. He called Cathy to

HDOJ题目2577 How to Type(dp)

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4467    Accepted Submission(s): 2034 Problem Description Pirates have finished developing the typing software. He called Cathy to tes

HDU 2577 分情况多维DP

How to Type Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6787    Accepted Submission(s): 3057 Problem Description Pirates have finished developing the typing software. He called Cathy to test

HDU 2577 How to Type 动态规划

友情题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2577 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=110; char str[N]; int close[N],open[N]; int MIN(int a ,int b) { return a=a<b?a:b; } int main(