栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1045 Favorite Color Stripe(30分)-PAT甲级

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1045 Favorite Color Stripe(30分)-PAT甲级

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 (≤104) 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

 题目大意:从一串长度为L的序列中选出包含给定长度为M的子序列的最长序列(子序列元素的相对位置不能发生改变),输出其长度

 思路:1、将给定长度为M的子序列的位置编个号,从左往右编号递增,要保证子序列元素的相对位置不发生改变,也就是说子序列元素的编号从左往右不下降,从而可以转换成最长不下降子序列的问题(动态规划-LIS)

2、转换为最长不下降子序列问题:从长度为L的序列的序列中选出包含给定长度为M的子序列元素的元素,按照原来的顺序存到A数组中,对A数组进行动态规划

3、最长不下降子序列的问题(动态规划-LIS)的状态方程

(j=1,2,…,i-1&&A[j]

4注意编号用map可能会超时,可以自己用数组实现哈希编号

 AC代码

#include 
#include 
using namespace std;
int main() {
	int n, m, k;
	scanf("%d", &n);
	scanf("%d", &m);
	int mp[10000] = {0};
	for (int i = 1; i <= m; i++) {
		int temp;
		scanf("%d", &temp); 
		mp[temp] = i;
	} 
	scanf("%d", &k);
	vector A; 
	for (int i = 0; i < k; i++) {
		int temp;
		scanf("%d", &temp); 
		if (mp[temp]) {
			A.push_back(temp);
		}
	}
		vector dp(A.size());
	int ans = -1;
	for (int i = 0; i < A.size(); i++) {
		dp[i] = 1;
		for (int j = 0; j < i; j++) {
			if (mp[A[i]] >= mp[A[j]] && dp[j] + 1 > dp[i]) {
				dp[i] = dp[j] + 1;
			}
		}
		ans =max(ans, dp[i]); 
	}
	cout << ans;
	return 0;
}

更多PAT甲级题目:请访问PAT甲级刷题之路--题目索引+知识点分析(正在进行),感谢支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/935357.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号