最长公共子序列 的 算法思路 在这里 点击进入  将 代码稍微改动一下 就可以   ,   最长公共子序列  是两个 字符串求 公共子序列  , 可以将其中的 一个 改为 从 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

单调递增最长子序列 - 从最长公共子序列到单调递增最长子序列相关推荐

  1. [csu/coj 1078]多个序列的最长公共子序列

    题意:给n个序列,同一个序列里面元素互不相同,求它们的最长公共子序列. 思路:任取一个序列,对于这个序列里面的两个数ai,aj(i<j),如果对于其它每一个序列,都出现过ai,aj,且ai在aj ...

  2. 算法知识之最长公共子序列问题(动态规划)

    最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...

  3. 动态规划---例题2.最长公共子序列问题

    本题与力扣主站1143题相同. 一.问题描述 一个给定序列的子序列是在该序列中删去若干元素后得到的序列. 确切地说,若给定序列X=<x1, x2,-, xm>,则另一序列Z=<z1, ...

  4. 动态规划之最长公共子序列问题

    问题描述 若给定序列X={x1,x2,-,xm},则另一序列Z={z1,z2,-,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,-,ik}使得对于所有j=1,2,-,k有:zj=xij ...

  5. 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)...

    作者:寒小阳 时间:2013年9月. 出处:http://blog.csdn.net/han_xiaoyang/article/details/11969497. 声明:版权所有,转载请注明出处,谢谢 ...

  6. 动态规划之最长递增子序列 最长不重复子串 最长公共子序列

    [前言]动态规划:与分治法相似,即通过组合子问题来求解原问题,不同的是分治法是将问题划分为互不相交的子问题,递归求解子问题,再将他们组合起来求出原问题的解. 动态规划则应用于子问题重叠的情况,通常用来 ...

  7. 动态规划-最长公共子序列-最长递增子序列-最大递增子序列和-miking time

    1. 最长公共子序列 假设 X 和 Y 的序列如下: X[1...m] = {A, B, C, B, D, A, B} Y[1...n] = {B, D, C, A, B, A} 可以看出,X 和 Y ...

  8. c语言最长公共子序列_序列比对(二十四)——最长公共子序列

    原创: hxj7 本文介绍如何求解两个字符串的最长公共子序列. 最长公共子序列问题 前文<序列比对(二十三)--最长公共子字符串>介绍了如何求解两个字符串的最长公共子字符串,本文将介绍如何 ...

  9. 使用最长公共子序列算法进行序列比对

    介绍 在分子生物学中,DNA 和蛋白质可以表示为字母序列. DNA 序列由 A.T.G.C 组成,代表核苷碱基(nucleobases) 腺嘌呤.胸腺嘧啶.鸟嘌呤和胞嘧啶. 蛋白质由 20 个不同的字 ...

最新文章

  1. 对TD tree的使用体验及建议
  2. 设置Kali Linux永不锁屏
  3. 为全局变量赋值_Postman全局变量设置和运用
  4. 图像拼接 SIFT资料合集
  5. Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接)
  6. dropdownlist javascript 取得value text
  7. go和python计算字节数组sha1
  8. mahout贝叶斯算法开发思路(拓展篇)1
  9. Java:JDK安装
  10. 李大维:互联网人做硬件创业容易产生的七大误解【转载】
  11. Android开发笔记(一百六十九)利用BottomNavigationView实现底部标签栏
  12. 数据科学家最常用的十种算法和方法
  13. 原生JavaScript添加format方法 ----占位符
  14. MySQL导出sql脚本文件
  15. python分词工具,你用哪个
  16. 【笔记】A Tutorial of Transformers_复旦大学邱锡鹏报告
  17. Win10系统,ColorPix取色位置偏移如何解决?
  18. 在天翼网关2.0上如何使用自己的路由器
  19. 计算机错误651是什么故障,宽带连接错误651是什么意思?
  20. SOA只不过是一种设计模式而已

热门文章

  1. 深度学习已经取得的进展
  2. 全双工和半双工的区别
  3. java redis 主从配置_Redis实现主从复制(MasterSlave)
  4. sap 用户权限表_干货丨SAP系统的RPA实施技巧
  5. python 程序中断_有趣的Python处理程序中断信号
  6. idea设置包为层级结构?
  7. 014_insert into select语句
  8. 003_JSONNull对象介绍
  9. 010_Post请求中文乱码
  10. dede php 常用,dede cms常用标签汇总 收藏版