PTA_PAT甲級_1045 Favorite Color Stripe (30分)

Eva is trying to make her own color stripe out of a given one. She would like to keep only her favorite colors in her favorite order by cutting off those unwanted pieces and sewing the remaining parts together to form her favorite color stripe.

It is said that a normal human eye can distinguish about less than 200 different colors, so Eva’s favorite colors are limited. However the original stripe could be very long, and Eva would like to have the remaining favorite stripe with the maximum length. So she needs your help to find her the best result.

Note that the solution might not be unique, but you only have to tell her the maximum length. For example, given a stripe of colors {2 2 4 1 5 5 6 3 1 1 5 6}. If Eva’s favorite colors are given in her favorite order as {2 3 1 5 6}, then she has 4 possible best solutions {2 2 1 1 1 5 6}, {2 2 1 5 5 5 6}, {2 2 1 5 5 6 6}, and {2 2 3 1 1 5 6}.

Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (≤200) which is the total number of colors involved (and hence the colors are numbered from 1 to N). Then the next line starts with a positive integer M (≤200) followed by M Eva’s favorite color numbers given in her favorite order. Finally the third line starts with a positive integer L (≤10​^4) which is the length of the given stripe, followed by L colors on the stripe. All the numbers in a line a separated by a space.

Output Specification:
For each test case, simply print in a line the maximum length of Eva’s favorite stripe.

Sample Input:

6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

Sample Output:

7

題意:
給出兩個序列,找出在第二個序列中按第一個數列中數字順序排列的最長子序列

分析:
把第一個序列中出現的元素映射爲從0起的遞增序列,第二個序列中的其他元素都映射爲-1,轉化爲最長不下降子序列問題

代碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXC 210//最大顏色數 
#define MAXN 10010//最大L 
int HashTable[MAXC];//喜歡的顏色映射爲從0起的遞增數列,不喜歡的映射爲-1 
int A[MAXN], dp[MAXN]; //最長不下降子序列的原始數組A和DP數組 

int main()
{
    int N, M, X;
	cin>>N>>M;
	memset(HashTable, -1, sizeof(HashTable));//整個數組初始化爲-1 
	for(int i=0;i<M;i++){
		cin>>X;
		HashTable[X] = i;//喜歡的顏色按出現順序映射成遞增數列 
	} 
	int L, num=0;//num存放顏色序列中Eva喜歡顏色的總數
	cin>>L;
	for(int i=0;i<L;i++){
		cin>>X;
		if(HashTable[X]>=0) A[num++] = HashTable[X];//若是喜歡的顏色則加入A數組 
	} 
	int ans = -1;
	for(int i=0;i<num;i++){//相當於忽略其他數,只有喜歡的顏色對應的數纔是數列 
		dp[i] = 1;
		for(int j=0;j<i;j++)
			if(A[i]>=A[j] && dp[j]+1>dp[i]) dp[i] = dp[j]+1;
		ans = max(ans, dp[i]);
	} 
	cout<<ans<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章