hdu How to Type (dp)

来源:互联网 发布:淘宝极速退款漏洞诈骗 编辑:程序博客网 时间:2024/05/29 17:26

How to Type

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 12   Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size:  

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

3PiratesHDUacmHDUACM

Sample Output

888<div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>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 8The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8</div>

Author

Dellenge

Source

HDU 2009-5 Programming Contest

dp的作法: 状态:在字符串的位置、caps lock的开关
转移方程:与当前所在位置字符的大小写有关
代码
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dp[105][2];int tag[105];int main(){    int t;    int i,j;    char str[105];    int len;    scanf("%d",&t);    while(t--){        memset(dp,0,sizeof(dp));        memset(tag,0,sizeof(tag));        scanf("%s",str);        len = strlen(str);        for(i = 0;i < len;i++)            if(str[i] >= 'A' && str[i] <= 'Z')                tag[i+1] = 1;        if(tag[1] == 0){            dp[1][1] = 3;            dp[1][0] = 1;        }        else{            dp[1][1] = 2;            dp[1][0] = 2;        }        for(i = 2;i <= len;i++){            if(tag[i] == 0){                dp[i][0] += min(dp[i-1][0]+1,dp[i-1][1]+2);                dp[i][1] += min(dp[i-1][0]+3,dp[i-1][1]+2);            }            else{                dp[i][0] += min(dp[i-1][0]+2,dp[i-1][1]+3);                dp[i][1] += min(dp[i-1][0]+2,dp[i-1][1]+1);            }            //printf("%d...%d\n",dp[i][0],dp[i][1]);        }        printf("%d\n",min(dp[len][0],dp[len][1]+1));    }    return 0;}

还有一种作法:Bfs
在拓展节点时,用优先队列进行维护,取出top进行拓展就可以了,作法的正确性可以自行验证
代码略

原创粉丝点击