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
题解:
该题运用动态规划,使用最长增长子序列(LIS)思想,在更新dp数组时需要判断当前颜色 i
和 i之前的颜色j
,满足c_order[i] >= c_order[j]
以及dp[j]+1 > dp[i]
,再更新dp[i]
#include <iostream>
using namespace std;
int n,m,l;
int c_order[210];
int cl[10010];
int dp[10010];
int main(){
fill(c_order,c_order+210,-1);
cin >> n >> m;
int temp;
for(int i=0;i<m;i++){
cin >> temp;
c_order[temp] = i;
}
cin >> l;
int index = 0;
for(int i=0;i<l;i++){
cin >> temp;
if(c_order[temp] != -1){
cl[index] = temp;
index++;
}
}
int ans = 0;
for(int i=0;i<index;i++){
dp[i] = 1;
for(int j = 0;j<i;j++){
if(c_order[cl[i]] >= c_order[cl[j]] && dp[j]+1 > dp[i]){
dp[i] = dp[j] + 1;
}
}
ans = max(ans,dp[i]);
}
cout << ans;
system("pause");
return 0;
}