标签:style class blog http get 代码
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264
题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次。求两个数列的最长公共子列。
思 路:首先找出每个数字在第二个数列中出现的位置,对于第一个数列构造出一个新的数列,每个数用这个数在第二个数列中出现的5个位置代替。这样求最长上升子 列。注意的是,在求到每个数(这里指原第一个数列中的每个数)为止的LIS时,替换后的5个数字要先求大的。。不清楚的看代码。
int a[N*5],b[N*5],n; vector<int> V[N]; int s[N*5]; void add(int x,int t) { while(x<N*5) { if(s[x]<t) s[x]=t; x+=x&-x; } } int get(int x) { int ans=0; while(x) { if(s[x]>ans) ans=s[x]; x-=x&-x; } return ans; } int main() { RD(n); int i,j; FOR1(i,n*5) RD(a[i]); FOR1(i,n*5) RD(b[i]),V[b[i]].pb(i); int ans=0,temp,x; for(i=1;i<=n*5;i++) { for(j=4;j>=0;j--) { x=V[a[i]][j]; temp=get(x-1)+1; if(temp>ans) ans=temp; add(x,temp); } } PR(ans); }
BZOJ 1264 基因匹配Match(LCS转化LIS),布布扣,bubuko.com
标签:style class blog http get 代码
原文地址:http://www.cnblogs.com/jianglangcaijin/p/3799458.html