魔族密碼

https://vijos.org/p/1028




描述

風之子剛走進他的考場,就……
花花:噹噹噹當~~偶是魅力女皇——花花!!^^(華麗出場,禮炮,鮮花)
風之子:我嘔……(殺死人的眼神)快說題目!否則……-_-###
花花:……咦~~好冷~~我們現在要解決的是魔族的密碼問題(自我陶醉:搞不好魔族裏面還會有人用密碼給我和菜蟲寫情書咧,哦活活,當然是給我的比較多拉*^_^*)。魔族現在使用一種新型的密碼系統。每一個密碼都是一個給定的僅包含小寫字母的英文單詞表,每個單詞至少包含1個字母,至多75個字母。如果在一個由一個詞或多個詞組成的表中,除了最後一個以外,每個單詞都被其後的一個單詞所包含,即前一個單詞是後一個單詞的前綴,則稱詞表爲一個詞鏈。例如下面單詞組成了一個詞鏈:
i
int
integer
但下面的單詞不組成詞鏈:
integer
intern
現在你要做的就是在一個給定的單詞表中取出一些詞,組成最長的詞鏈,就是包含單詞數最多的詞鏈。將它的單詞數統計出來,就得到密碼了。

風之子:密碼就是最長詞鏈所包括的單詞數阿……
花花:活活活,還有,這些文件的格式是,第一行爲單詞表中的單詞數N(1<=N<=2000),下面每一行有一個單詞,按字典順序排列,中間也沒有重複的單詞咧!!你要提交的文件中只要在第一行輸出密碼就行啦^^看你長得還不錯,給你一個樣例吧:

樣例1

樣例輸入1[複製]

5
i
int
integer
intern
internet

樣例輸出1

4

只是模擬,從後往前,比後一個大的就直接跳出.不跳出就每個判斷.如果k=長達,就++;
判斷max
#include <string.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	char s[2000][75];
	int len[2000];
	int i,j,k,n,tmpn,max=1,fs;
	scanf("%d",&n);
	for(i=0;i<n;i++) 
	{
		scanf("%s",s[i]);len[i]=strlen(s[i]);
	}
	for(i=n-1;i>0;i--)
	{
		tmpn=1;fs=i;
		for(j=i-1;j>=0;j--)
		{
			if(len[fs]<len[j]) 
				continue;
			for(k=0;k<=len[j];k++)
				if(s[fs][k]!=s[j][k])
					break;
			if(k==len[j]) 
			{
				tmpn++;fs=j;
			}
		}
		if(max<tmpn) max=tmpn;
	}
	printf("%d",max);
}






用上dp....感覺....
#include <string.h>
#include<cstdio>
#include<iostream>
using namespace std;
char a[2009][80];
int main()
{
	int n;
	while(cin>>n)
	{
		int len[2009],dp[2009],max=-1;
		memset(dp,0,sizeof(dp));
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			len[i]=strlen(a[i]);
		}
		for(int i=n-1;i>=0;i--)
		{
			for(int j=i-1;j>=0;j--)
			{
				int k;
				if(len[j]>len[i])
					continue;
				for(k=0;k<len[j];k++)
					if(a[i][k]!=a[j][k])
						break;
				if(k==(len[j]))
				{
					if((dp[i]+1)>dp[i])
						dp[i]=dp[i]+1;;
				} 
			//cout<<k<<" "<<len[j]<<endl;
			}
			 if(max<dp[i])
			max=dp[i]; 
			
			 
		}
		cout<<max+1<<endl;
	}



}

最後max+1是因爲我沒有算自己


發佈了65 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章