HDU 2577 How to Type(dp题)
时间:2014-04-29 19:16:47
收藏:0
阅读:670
题目链接: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 }
评论(0)