题意:给你u种喜欢的颜色,并且这u种颜色又先后顺序,再给你一个L序列
让你在L序列中找出最长的我喜欢的序列
思路:以任何序列结尾都会有最长的喜欢序列
这个位置是我喜欢的颜色,那么就需要在前面找到我最喜欢的并且优先级高于我的位置的长度+1
这个位置不是我喜欢的颜色,只需要找到最长的序列位置即可
// PAT A1045Favorite Color Stripe.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string>
#include <iostream>
using namespace std;
int favorite[210];
int L[10010];
int dp[10010];
int _tmain(int argc, _TCHAR* argv[])
{
int n,m; int i;
scanf("%d %d",&n,&m);
fill(favorite,favorite+n,-1);
for(i =0;i<m;i++){
int e; scanf("%d",&e);
favorite[e] = n-i;//给喜欢的颜色排序
}
int u; scanf("%d",&u);//stripe
for(i = 0 ;i < u;i++){
scanf("%d",&L[i]);
}
fill(dp,dp+10010,0);
if(favorite[L[0]] != -1){
dp[0] = 1;
}else{
dp[0] = 0;
}
for(i =1;i<=u;i++){//计算以i结尾的颜色的最大长度
int max = 0;
//这个颜色不是我喜欢的
if(favorite[L[i]] == -1){
for(int j = 0;j<i;j++){
if(dp[j] > max){
max= dp[j];
}
}
dp[i] = max;
continue;
}
//这个颜色是我喜欢的
//找到从第一个位置开始并且优先级高于等于我的位置
for(int j =0;j<i;j++){
if(favorite[L[j]] >= favorite[L[i]]){
if(dp[j] >= max){
max = dp[j];
}
}
dp[i] = max + 1;
}
}
m
/*for(int i = 0;i<u;i++){
printf("%d ",dp[i]);
}
printf("\n");*/
sort(dp,dp+u);
printf("%d\n",dp[u-1]);
system("pause");
return 0;
}