1756 简单的LCS

来源:互联网 发布:物理电子实验室软件 编辑:程序博客网 时间:2024/06/05 06:26
描述          
题目确实很简单,给两个序列,求其LCS

对于每个序列,每个元素均为[1,50000]之间的整数,且数字不会重复出现


输入

对每组数据

P(1<=P<=10000),Q(1<=Q<=10000)

接着两行,第一行为P个数字

第二行为Q个数字

若遇P=Q=0表示文件尾,此行不处理


输出

两个序列的LCS
样例输入
1 233 43 41 2 31 2 3 40 0
样例输出
13
提示

转换为最长上升子列

用数组b[i]记录长度为i的所有最长上升子列中最后一位的最小值即可,二分
#include <iostream>using namespace std;int dp[10001], a[10001], b[10001];int seek(int a[], int x, int len){int left = 0; int right = len - 1;int mid;while(left <= right){mid = (left + right) / 2;if(x < a[mid])right = mid - 1;elseleft = mid + 1;}return left;}int main(){int p, q, i, x;while(1){cin >> p >> q;if(p == 0 && q == 0)break;for(i = 1; i <= 10000; i ++)a[i] = 0;for(i = 1; i <= p; i ++){cin >> x;a[x] = i;}int num = 0;for(i = 1; i <= q; i ++){cin >> x;if(a[x] != 0)b[++ num] = a[x];}dp[0] = b[1];int len = 1;for(i = 2; i <= num; i ++){x = b[i];int pos = seek(dp, x, len);dp[pos] = x;if(pos > len - 1) len ++;}cout << len << '\n';}return 0;}


 

原创粉丝点击