zoukankan      html  css  js  c++  java
  • 单调递增最长子序列

    最长公共子序列 的 算法思路 在这里 点击进入  将 代码稍微改动一下 就可以   ,   最长公共子序列  是两个 字符串求 公共子序列  , 可以将其中的 一个 改为 从 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
    ",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
    ",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
    ",num);
    33     }
    34     return 0;
    35 }
  • 相关阅读:
    hibernate 笔记二
    log4j详解及简易搭建
    hibernate 笔记一
    【工作心得】timesten应用(安装配置篇)
    【转】boost 内存池
    【转】基于Socket的UDP和TCP编程介绍
    【工作心得】timesten应用(开发篇)
    【读书笔记】UNIX进程间通信
    【读书笔记】硬链接与软链接
    【转】Linux Socket编程
  • 原文地址:https://www.cnblogs.com/A-FM/p/5422295.html
Copyright © 2011-2022 走看看