1045 Favorite Color Stripe(LIS解法)

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1045 Favorite Color Stripe(LIS解法)相关的知识,希望对你有一定的参考价值。

解题思路

本题属于Longest Increasing Sequence最长不下降子序列,但是要注意,LIS当中不会有无效的元素,而本题是有的,所以先要把无效元素过滤掉,才能转化成为LIS问题。

这里用到了hashTable(用map更慢),初始化全零。有两个用处:1.将元素设置成伊娃规定的的顺序,然后映射到顺序上,不再对原数组进行排序(因为反正是计数,不需要保留原数据) 2.是过滤掉不是伊娃想要的元素。

有一个特别易错的点,我认为递归边界是dp[0] = 1,但是这不严谨,因为在过滤一遍之后,每个元素都能自成一个子序列,所以应当是dp[i]  = 1。

·珍藏版原创测试用例

4
3 1 2 3
10 4 2 4 1 1 2 1 1 1 4

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;

const int INF = 1000000000;//10的9次方 
const int maxn = 10010;
const double eps = 1e-3;

int type,colorN,EvaN;//感觉type是无用的 
int hashTable[210] = {0};
int b[maxn];
int dp[maxn] = {0}; 


int main(){
	
	scanf("%d",&type);
	scanf("%d",&EvaN);
	for(int i=1;i<=EvaN;i++){
		int color;
		scanf("%d",&color);
		hashTable[color] = i; 
	}
	
	int num = 0;
	scanf("%d",&colorN);
	for(int i=0;i<colorN;i++){
		int color;
		scanf("%d",&color);
		if(hashTable[color]>0)b[num++] = hashTable[color];
	}
	
	int ans = 0;
	
	for(int i=0;i<num;i++){
		dp[i] = 1;
		//每一轮更新一个元素的dp
		for(int j=0;j<i;j++){
			if(dp[j]+1>dp[i]&&b[j]<=b[i])dp[i] = dp[j] + 1;
		}
		//每一轮结束更新ans
		ans = max(ans,dp[i]); 
	}
	
	printf("%d\\n",ans);
	
	return 0; 
}

以上是关于1045 Favorite Color Stripe(LIS解法)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1045. Favorite Color Stripe

PAT 1045. Favorite Color Stripe (30)

1045. Favorite Color Stripe (30)-PAT甲级真题

1045 Favorite Color Stripe (最长不下降子序列 LIS)

[pat]1045 Favorite Color Stripe

1045 Favorite Color Stripe(LIS解法)