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): 4658 Accepted Submission(s): 2110
The string "HDUACM", can type this way Caps lock h, d, u, a, c, m, Caps lock, the answer is 8
题意就是每组给一个字符串,问你打出这个字符串须要敲多少次键盘要求打完后CapsLock保持关闭.(注意按一次Shift仅仅能输入一个字母,同一时候在CapsLock开启时使用Shift能输入小写字母). 作为菜鸟。下边是看大神的分析::: 这题能够直接将连续的(大写和小写同样的)字母依据长度分为长度为1和长度为1以上的来处理,一遍遍历后得出结果(复杂度O(n)),当然也能够使用DP来做. 这里给出DP的做法. 对于每个字符,针对输入前后CapsLock开启关闭状态分类 若输入后CapsLock关闭 假如输入前关闭,则要么直接输入(小写字母),要么用Shift+当前字母输入(大写字母) 假如输入前开启,要么先输入当前字母再按CapsLock(当前字母是大写的),要么先按CapsLock再输入字母(当前字母小写),都是按两次 若输入后CapsLock开启 假如输入前开启,则要么直接输入(大写字母),要么用Shift+当前字母输入(小写字母) 假如输入前关闭,要么先输入当前字母再按CapsLock(当前字母是小写的),要么先按CapsLock再输入字母(当前字母大写),都是按两次 由此能够得出状态转移方程 我们用DP[i][0]来代表输入第i个字母后且CapsLock关闭的情况下须要的最少次数,用DP[i][1]来代表输入第i个字母后且CapsLock开启的情况下须要的最少次数,并定义函数int check(char ch),若ch为大写字母,则返回1,否则返回0,则有 dp[i][0]=min(dp[i-1][0]+check(s[i])+1,dp[i-1][1]+2) dp[i][1]=min(dp[i-1][0]+2,dp[i-1][1]+2-check(s[i])) 特殊的,当i==0时 dp[0][0]=check(s[i])+1 dp[0][1]=2 多练,,,。2015,7,21
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char s[110];
int dp[110][2];
int check(char a)
{
	if(a>='A'&&a<='Z')
		return 1;
	return 0;
}
int main()
{
	int t,i,len;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%s",s);
		len=strlen(s);
		for(i=0;i<len;i++)
		{
			if(i==0)
			{
				dp[i][0]=check(s[0])+1;
				dp[i][1]=2;
			}
			else
			{
				dp[i][0]=min(dp[i-1][0]+check(s[i])+1,dp[i-1][1]+2);
				dp[i][1]=min(dp[i-1][1]+2-check(s[i]),dp[i-1][0]+2);
			}
		}
		printf("%d\n",dp[len-1][0]);
	}
	return 0;
} 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号