首页 > 代码库 > 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] = min(dp[i],dp[j-1] + judge1(j,i));
dp[i] = min(dp[i],dp[j-1] + judge2(j,i));

两种输入方式分别是从第j个字符到第i个字符打开大写锁定来输入,另一种方式是关闭大写锁定来输入第j到i的字符。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cmath>
 6 #include<deque>
 7 #include<map>
 8 #include<queue>
 9 #include<cstdlib>
10 using namespace std;
11 const int maxn = 105;
12 char str[maxn];
13 int dp[maxn];
14 int judge1(int x,int y)
15 {
16     int sum = 2;
17     for(int i = x;i <= y;++i)
18     if(str[i] >= A && str[i] <= Z)
19     sum++;
20     else if(str[i] >= a && str[i] <= z)
21     sum += 2;
22     return sum;
23 }
24 int judge2(int x,int y)
25 {
26     int sum = 0;
27     for(int i = x;i <= y;++i)
28     if(str[i] >= A && str[i] <= Z)
29     sum += 2;
30     else if(str[i] >= a && str[i] <= z)
31     sum++;
32     return sum;
33 }
34 int main()
35 {
36     int T;
37     scanf("%d",&T);
38     while(T--)
39     {
40         scanf("%s",str+1);
41         int len = strlen(str+1);
42         memset(dp,0x3f,sizeof(dp));
43         dp[0] = 0;    //使0号为0,后面要-1,不用做特殊处理 
44         for(int i = 1;i <= len;++i)
45         for(int j = 1;j <= i;++j)
46         {
47             dp[i] = min(dp[i],dp[j-1] + judge1(j,i));
48             dp[i] = min(dp[i],dp[j-1] + judge2(j,i));
49         }
50         printf("%d\n",dp[len]);
51     }
52     return 0;
53 }        
View Code