日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列

發布時間:2025/4/16 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

最長公共子序列 的 算法思路 在這里?點擊進入? 將 代碼稍微改動一下 就可以 ? , ? 最長公共子序列 ?是兩個 字符串求 公共子序列 ?, 可以將其中的 一個 改為 從 a 到 z ?這樣輸入另一個 就得到了 ?單調遞增最長子 ?序列 ?下面附上題目 和 代碼?

這個是 ?時間復雜度 為 N ?也算是 最優時間復雜度 ? ?

1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 using namespace std; 15 int t,c[30][10005]; 16 char a[30],b[10005]; 17 int main() 18 { 19 scanf("%d",&t); 20 for(int i=0;i<=26;i++) 21 a[i]='a'+i; 22 while(t--) 23 { 24 scanf("%s",b); 25 int lb=strlen(b); 26 memset(c,0,sizeof(c)); 27 for(int i=1;i<=26;i++) 28 { 29 for(int j=1;j<=lb;j++) 30 { 31 if(a[i-1]==b[j-1]) 32 c[i][j]=c[i-1][j-1]+1; 33 else 34 c[i][j]=c[i][j-1]>c[i-1][j]?c[i][j-1]:c[i-1][j]; 35 } 36 } 37 printf("%d\n",c[26][lb]); 38 } 39 return 0; 40 }

?下面附上一個時間復雜度為 N^2 的普通算法 ? ( 這個也算是比較普通 , 比較通用的算法了 ?)

1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int main() 17 { 18 int t,l,dp[10005]; 19 char a[10005]; 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%s",a); 24 l=strlen(a); 25 for(int i=0;i<l;i++) 26 { 27 dp[i]=1; 28 } 29 for(int i=1;i<l;i++) 30 for(int j=0;j<i;j++) 31 { 32 if(a[i]>a[j]) 33 dp[i]=max(dp[i],dp[j]+1); 34 } 35 int maxn=INT_MIN; 36 for(int i=0;i<l;i++) 37 maxn=maxn>dp[i]?maxn:dp[i]; 38 printf("%d\n",maxn); 39 } 40 return 0; 41 }

?

?還有一個 時間復雜度 為 ?N log N 的 ?二分法 算法?

1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int main() 17 { 18 int t,l; 19 char a[10005],dp[10005]; 20 scanf("%d",&t); 21 while(t--) 22 { 23 scanf("%s",a); 24 l=strlen(a); 25 int location,num=0; 26 for(int i=0;i<l;i++) 27 { 28 location=lower_bound(dp,dp+num,a[i])-dp; 29 dp[location]=a[i]; 30 num=location+1>num?location+1:num; 31 } 32 printf("%d\n",num); 33 } 34 return 0; 35 }

?

轉載于:https://www.cnblogs.com/A-FM/p/5422295.html

總結

以上是生活随笔為你收集整理的单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列的全部內容,希望文章能夠幫你解決所遇到的問題。

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