日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

哈理工OJ—1598【DP最长公共子序列O(nlogn)】

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 哈理工OJ—1598【DP最长公共子序列O(nlogn)】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

哈理工1598-序列問題III
Description
有倆個長度分別為p和q的序列A和B,每個序列的各個元素互不相同,且每個元素的大小都是1~(p和q中的最大值)之間的正整數。
倆個序列的第一個元素都為1,求出A和B的最長公共子序列長度。
Input
輸入第一行為數據組數T(T<=20)。每組數據包括3行,第一行為2個整數p和q(1<=p,q<=10000),
第二行包含序列A,其中第一個數為1。
第三行包含序列B,格式同序列A。
Output
對于每組數據,輸出A和B的最長公共子序列的長度。
Sample Input
2
3 2
1 2 3
1 2
7 8
1 7 5 4 8 3 2
1 4 3 5 6 2 8 7
Sample Output
2
4
Hint
對于第二組數據最長公共子序列為1,4,3,2。

#include<stdio.h> #include<string.h> #include<map> #include<algorithm> using namespace std; int a[1000800]; int f[1000800]; int Slove(int n) {int c=0;for(int i=1; i<=n; i++){int t=a[i];if(i==1){f[++c]=t;}else{if(t>f[c]) f[++c]=t;else{int pos=lower_bound(f+1,f+c,t)-f;f[pos]=t;}}}return c; }int main() {int t;scanf("%d",&t);while(t--){int n,m;scanf("%d%d",&n,&m);map<int,int >pos;for(int i=1; i<=n; i++){int x;scanf("%d",&x);pos[x]=i;}for(int i=1; i<=m; i++){int x;scanf("%d",&x);if(pos[x]==0)a[i]=-1;elsea[i]=pos[x];}printf("%d\n",Slove(m));} }

!!!

> map<int,int >pos; > int pos=lower_bound(f+1,f+c,t)-f; > 二分法找到比t大的第一個位置

最大公共子序列:找對應的最長上升子序列的個數
MLE

#include<bits/stdc++.h> using namespace std; int dp[11111][11111];int T,len1,len2;int s1[11111],s2[11111]; int main() {scanf("%d",&T);while(T--){memset(dp,0,sizeof(dp));memset(s1,0,sizeof(s1));memset(s2,0,sizeof(s2));scanf("%d%d",&len1,&len2);for(int i=0;i<len1;i++){scanf("%d",&s1[i]);}for(int i=0;i<len2;i++){scanf("%d",&s2[i]);}for(int i=1;i<=len1;i++){for(int j=1;j<=len2;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}printf("%d\n",dp[len1][len2]);}}

總結

以上是生活随笔為你收集整理的哈理工OJ—1598【DP最长公共子序列O(nlogn)】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。