Prince and Princess(最長公共子序列優化,動態規劃)
阿新 • • 發佈:2019-01-09
<a target=_blank href="https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1576">
</a>
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1576題意:就是求兩個序列的最長公共子序列
思路:因為資料量是10^5的,一般的n^2的演算法會TML。
所以得優化,就是把a中出現的數,在b中出現過的對應的位置記錄下來,然後用nlgn的方法求一遍最長上升子序列即可
#include<cstdio> #include<cstring> #include <string> #include <iostream> #include <algorithm> #include <vector> #include <map> using namespace std; #define MAXN 62505 #define INF 1000000000 int a[MAXN]; int b[MAXN]; int dp[MAXN]; int c[MAXN]; map <int,int> m; int n,p,q; int main(){ int t; scanf("%d",&t); for(int cas=1;cas<=t;cas++) { scanf("%d%d%d",&n,&p,&q); for(int i=0;i<=p;i++) scanf("%d",a+i); for(int j=0;j<=q;j++){ scanf("%d",b+j); m[b[j]]=j; } c[0]=0; int k=1; for(int i=0;i<=p;i++){ if(m[a[i]]) c[k++]=m[a[i]]; } fill(dp,dp+k,INF); for(int i=0;i<k;i++){ *lower_bound(dp,dp+k,c[i])=c[i]; } printf("Case %d: %d\n",cas,lower_bound(dp,dp+k,INF)-dp); } }