codevs 2185 最长公共上升子序列--nm的一维求法
生活随笔
收集整理的這篇文章主要介紹了
codevs 2185 最长公共上升子序列--nm的一维求法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2185 最長公共上升子序列
?時(shí)間限制: 1 s ?空間限制: 32000 KB ?題目等級 : 鉆石 Diamond 題目描述?Description熊大媽的奶牛在小沐沐的熏陶下開始研究信息題目。小沐沐先讓奶牛研究了最長上升子序列,再讓他們研究了最長公共子序列,現(xiàn)在又讓他們要研究最長公共上升子序列了。
小沐沐說,對于兩個(gè)串A,B,如果它們都包含一段位置不一定連續(xù)的數(shù)字,且數(shù)字是嚴(yán)格遞增的,那么稱這一段數(shù)字是兩個(gè)串的公共上升子串,而所有的公共上升子串中最長的就是最長公共上升子串了。
奶牛半懂不懂,小沐沐要你來告訴奶牛什么是最長公共上升子串。不過,只要告訴奶牛它的長度就可以了。
第一行N,表示A,B的長度。
第二行,串A。
第三行,串B。
輸出長度。
樣例輸入?Sample Input4
2 2 1 3
2 1 2 3
2
數(shù)據(jù)范圍及提示?Data Size & Hint1<=N<=3000,A,B中的數(shù)字不超過maxlongint
/*思路:f[]數(shù)組里面儲存著到b的第i項(xiàng),a從1--n的且以b[i]結(jié)尾的最長公共上升子序列長度,問題一: dp方程說明:if(a[i]>b[j]&&maxx<f[j])更新可以用于更新b序列與a序列前i位的最長長度的最大值 maxx=f[j];if(a[i]==b[j]) f[j]=maxx+1;因?yàn)閖是內(nèi)循環(huán),所以如果maxx被更新了,則現(xiàn)在的b[j]是等于a[i],一定比更新maxx的bj大,所以可以直接加。 問題二: 為什么可以改為一維?:類似于背包問題,假如用f[i][j]表示到了a的第i項(xiàng)(不一定為ai結(jié)尾),以b的第j項(xiàng)結(jié)尾的最長長度,那么 f[i][j],如果ai!=bj,那么f[i-1][j]就是最佳選擇,而且一定比f[i-2][j]優(yōu),而當(dāng)ai==bj的時(shí)候,我們用maxx更新f[i][j],與之前的無關(guān),那么可見F[i][j]只與i-1的值有關(guān),那么就可以用一唯數(shù)組了。 */ #include<iostream> using namespace std; #include<cstdio> const int N=3001; int a[N],b[N],f[N],maxx; int main() {ios::sync_with_stdio(false);int n;cin>>n;for(int i=1;i<=n;++i)cin>>a[i];for(int i=1;i<=n;++i)cin>>b[i];for(int i=1;i<=n;++i){maxx=0;for(int j=1;j<=n;++j){if(a[i]>b[j]&&maxx<f[j])maxx=f[j];if(a[i]==b[j]) f[j]=maxx+1;}}maxx=0;for(int i=1;i<=n;++i)/*因?yàn)閷τ趂[]數(shù)組我們是規(guī)定了結(jié)尾,所以f[n]不一定是最優(yōu)值,所以要全搜索一次*/maxx=max(f[i],maxx);cout<<maxx<<endl;return 0; } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/c1299401227/p/5323569.html
總結(jié)
以上是生活随笔為你收集整理的codevs 2185 最长公共上升子序列--nm的一维求法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle传输表空间介绍
- 下一篇: MUI - 预加载