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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CODEVS 1408 最长公共子序列

發(fā)布時間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CODEVS 1408 最长公共子序列 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目描述 Description
熊大媽的奶牛在小沐沐的熏陶下開始研究信息題目。小沐沐先讓奶牛研究了最長上升子序列,再讓他們研究了最長公共子序列,現(xiàn)在又讓他們要研究最長公共上升子序列了。
小沐沐說,對于兩個串A,B,如果它們都包含一段位置不一定連續(xù)的數(shù)字,且數(shù)字是嚴格遞增的,那么稱這一段數(shù)字是兩個串的公共上升子串,而所有的公共上升子串中最長的就是最長公共上升子串了。
奶牛半懂不懂,小沐沐要你來告訴奶牛什么是最長公共上升子串。不過,只要告訴奶牛它的長度就可以了。

輸入描述 Input Description
第一行N,表示A,B的長度。
第二行,串A。
第三行,串B。

輸出描述 Output Description
輸出長度

樣例輸入 Sample Input
4
2 2 1 3
2 1 2 3

樣例輸出 Sample Output
2

數(shù)據(jù)范圍及提示 Data Size & Hint
1<=N<=3000,A,B中的數(shù)字不超過maxlongint
.
.
.
.
.

分析

f[i][j]維護的是A中前i個,B中以第j個結(jié)尾的最長公共上升子序列的長度

看清楚哈,i在A中的概念是前i個,意思是并不要求一定要是i結(jié)尾

B中的j是必須是j結(jié)尾的

然后怎么轉(zhuǎn)移呢?

首先,當(dāng)A[i]!=B[j]的時候,因為B[j]必須要用來結(jié)尾,所以f[i][j]=f[i-1][j]

當(dāng)A[i]==B[j]的時候,會有f[i][j]=max(f[i-1][k])+1
其中B[k] < A[i] 且 k < j

因為B[k] < A[i],所以f[i][j]肯定是可以從f[i-1][k]轉(zhuǎn)移過來的

其次,因為A[i]要和B[j]組成一起,所以是從f[i-1]里面找,而不是在f[i]里面找,再其次,B[j]是后來要被使用的,所以k < j也是肯定的

現(xiàn)在問題就是,如果k是枚舉,那么復(fù)雜度就是O(n^3)了,就會TLE

所以必須用O(1)的方法,求出k

再看到是B[k] < A[i],但是i是第一層循環(huán),,所以我們只要在第二層循環(huán)里面,維護k,使得B[k] < A[i],且f[i-1][k]是最大的
.
.
.
.
.

程序:
#include<iostream> using namespace std; int f[3001][3001],a[3001],b[3001]; int main() {int n;cin>>n;for (int i=1;i<=n;i++) cin>>a[i];for (int i=1;i<=n;i++) cin>>b[i];a[0]=b[0]=-2147483647;for (int i=1;i<=n;i++){int val=0;if (b[0]<a[i]) val=f[i-1][0];for (int j=1;j<=n;j++){if (a[i]==b[j]) f[i][j]=val+1; else f[i][j]=f[i-1][j];if (b[j]<a[i]) val=max(f[i-1][j],val);}}int ans=0;for (int i=1;i<=n;i++) ans=max(f[n][i],ans);cout<<ans; }

轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499891.html

總結(jié)

以上是生活随笔為你收集整理的CODEVS 1408 最长公共子序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。