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 #include<algorithm>
 5 using namespace std;
 6
 7 int dp[200][2];
 8 char s[200];
 9
10 int main()
11 {
12     int ncase,i,len,ans;
13     scanf("%d",&ncase);
14     getchar();
15     while(ncase--)
16     {
17         memset(dp,0,sizeof(dp));
18         ans=0;
19         gets(s+1);
20         len=strlen(s+1);
21         dp[0][0]=0;
22         dp[0][1]=1;
23         for(i=1;i<=len;i++)
24         {
25             if(s[i]>=‘A‘&&s[i]<=‘Z‘)
26             {
27                 dp[i][1]=min(dp[i-1][1]+1,dp[i-1][0]+2);
28                 dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+2);
29             }
30             else
31             {
32                 dp[i][1]=min(dp[i-1][1]+2,dp[i-1][0]+2);
33                 dp[i][0]=min(dp[i-1][1]+2,dp[i-1][0]+1);
34             }
35         }
36         ans=min(dp[len][0],dp[len][1]+1);
37         printf("%d\n",ans);
38     }
39 }

时间: 2024-10-13 21:29:11

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]

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 1503 LCS输出路径【dp】

hdu 1503 不知道最后怎么输出,因为公共部分只输出一次.有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走.我用1表示向上走,2向左上方走,3向左走. 刚开始输入字符串时有两种方法,直接输入:或从地址后一位输入,即此时数组起始编号为1.直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS.两者在路径输出时有些差别,以前

HDU2577 How to Type【DP】

题目链接: http://acm.hdu.edu.cn/showproblem.php? pid=2577 题目大意: 给你一个仅仅包括大写和小写字母的字符串,如今Pirates要从键盘上输出它.按CapsLk可开 启关闭大写和小写指示灯. 按Shift可转换将输入字母的大写和小写而不改变CapsLk的开关状态.Pirates有 一个坏习惯,假设输入的时候CapsLk是开着的,那么输入结束后必须把它关闭. 问,输入一个字符 串,最小的按键数目是多少 思路: 用两个数组dpa和dpb分别来表示Ca

hdu 1078 FatMouse and Cheese【dp】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:每次只能走 横着或竖着的 1~k 个格子,求最多能吃到的奶酪. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <func

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 4908 BestCoder Sequence【DP】

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目大意:给出一个排列,一个m,求出这个排列的连续子序列中有多少个序列式以m为中位数. 由于是一个排列,不会出现重复的数字,记录一下m的位置index,然后以index为分界线,往左求出s[i](表示从i到index之间有多少大于m),b[i](表示从i到index之间有多少小于m),往右求出s[i](表示从index到i之间有多少大于m),b[i](表示从index到i之间有多少小于m).

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10