【题意】
给出一个数字串,找到其中优先级非递减的最长子序列长度
【思路】
实质就是 LIS
(最长上升子序列) 问题。
另外也看到用 LCS
(最长公共子序列)思路做的,可以看看拓宽思路。
LIS 有 O(n^2) 和 O(nlogn) 的写法,这里用的是前者。这道题时间卡的没那么紧,可以AC
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main(int argc, char const *argv[])
{
map<int,int> favorite;
vector<int> input;
vector<int> len;
int n,m,l;
cin >> n >> m;
for(int i=0; i<m; i++){
int tmp;
cin >> tmp;
favorite[tmp] = i;
}
cin >> l;
for(int i=0; i<l; i++){
int tmp;
cin >> tmp;
if(favorite.find(tmp)!=favorite.end()){
input.push_back(favorite[tmp]);
}
}
int max = 1;
len.assign(l,1);
for(int i=0; i<input.size(); i++){
for(int j=0; j<i; j++){
if(input[j]<=input[i] && len[j]+1>len[i]){
len[i] = len[j]+1;
}
}
if(len[i]>max){
max = len[i];
}
}
cout << max;
system("pause");
return 0;
}