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 }

HDU 2577 How to Type(dp题),码迷,mamicode.com

时间: 2024-12-22 22:08:54

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

HDU 2577 How to Type (DP,经典)

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

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)

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 tes

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

传送门 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

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(

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): 3704    Accepted Submission(s): 1697 Problem Description Pirates have finished developing the typing software. He called Cathy to tes

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //