题目链接: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 }
HDU 2577 How to Type(dp题),码迷,mamicode.com
时间: 2024-12-22 22:08:54