程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2577 How to Type DP也可以模擬

HDU 2577 How to Type DP也可以模擬

編輯:C++入門知識

http://acm.hdu.edu.cn/showproblem.php?pid=2577

大意:

大家都打過字吧,現在有個有趣的問題:給你一串字符串,有大寫有小寫,要求你按鍵次數最少來輸出它,輸出按鍵次數。

大寫字母可以通過caps lock 也可以用shift得到,小寫也是。

但是起始狀態和最後caps lock都是不鎖定的。

求最少的按鍵次數。


思路:


不用DP的方法:

當有連續的大寫或者小寫用caps lock 鍵,否則用shift。

#include
#include
const int MAXN=110;
int main()
{
	int T;
	scanf("%d",&T);

	while(T--)
	{
		char a[MAXN];
		scanf("%s",a);
		int len=strlen(a);
		bool capslock=false;
		int cnt=0;
		for(int i=0;i= 'A' && a[i] <= 'Z')
			{
				if(capslock==false)
					cnt++;    //shift or capslock

				if(a[i+1]>= 'A' && a[i+1] <= 'Z')
						capslock=true;			
				cnt++;
			}
			else 
			{
				if(capslock==true)
					cnt++;    //shift or capslock
				if(a[i+1]>= 'a' && a[i+1] <= 'z' ||a[i+1]=='\0') //a[i+1]=='\0'必須加,這也就是模擬wa原因
						capslock=false;
				cnt++;
			}
		}
		if(capslock)
			cnt++;
		printf("%d\n",cnt);

	}
	return 0;
}


DP的方法

設lock[i]為敲完第i個之後為鎖定狀態,而notlock[i]為敲完第i個之後為沒有鎖定狀態

則分大小寫討論:

a[i]若為大寫:

lock[i]=min(lock[i-1]+1,notlock[i-1]+2);
notlock[i]=min(lock[i-1]+2,notlock[i-1]+2);

否則:

lock[i]=min(lock[i-1]+2,notlock[i-1]+2);
notlock[i]=min(lock[i-1]+2,notlock[i-1]+1);

至於怎麼來的,你敲一下鍵盤你就懂了

還有就是最後要變成沒有鎖定狀態。。

#include
#include
#include
#include
using namespace std;
const int MAXN=110;
int main()
{
	int T;
	scanf("%d",&T);

	while(T--)
	{
		char a[MAXN];
		int lock[MAXN]={0};
		int notlock[MAXN]={0};
		scanf("%s",a);
		int len=strlen(a);
		if(isupper(a[0]))
		{
			lock[0]=2;
			notlock[0]=2;
		}
		else
		{
			lock[0]=2;
			notlock[0]=1;
		}

		for(int i=1;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved