HDU-2577 How to Type DP

字符输入问题,刚开始没有考虑到shift+字符输入和当前大小写锁定状态相反状态字符只需要两步的问题。

状态转移方程:dp1[i]表示输入完第i个字符后为大写状态需要的步数 dp2[i]表示输入完第i个字符后为小写状态所需要的步数

如果第i个字符为小写:

dp1[i]=min(dp1[i-1]+2,dp2[i-1]+2);

dp2[i]=min(dp1[i-1]+2,dp2[i-1]+1);

如果第i个字符为大写:

dp1[i]=min(dp1[i-1]+1,dp2[i-1]+2);

dp2[i]=min(dp1[i-1]+2,dp2[i-1]+2);

#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
char s[111];
int dp1[111];
int dp2[111];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s);
		int len=strlen(s);
		if(s[0]>='A'&&s[0]<='Z')
		{
			dp1[0]=2;
			dp2[0]=2;
		}
		else
		{
			dp1[0]=2;
			dp2[0]=1;
		}
		for(int i=1;i<len;i++)
		{
			if(s[i]>='A'&&s[i]<='Z')
			{
				dp1[i]=min(dp1[i-1]+1,dp2[i-1]+2);
				dp2[i]=min(dp1[i-1]+2,dp2[i-1]+2);
			}
			else
			{
				dp1[i]=min(dp1[i-1]+2,dp2[i-1]+2);
				dp2[i]=min(dp1[i-1]+2,dp2[i-1]+1);
			}
		}
		cout<<dp2[len-1]<<endl;
	}
	return 0;
}
时间: 2024-12-29 23:51:41

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(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(模拟)

题目链接  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

HDU 1069 Monkey and Banana(DP 长方体堆放问题)

Monkey and Banana Problem Description A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever