整理的一些模版LCS(连续和非连续)

对于连续的最大串,我们称之为子串....非连续的称之为公共序列..

代码:

非连续连续

 1 int LCS(char a[],char b[],char sav[]){
 2     int lena=strlen(a);
 3     int lenb=strlen(b);
 4     int i,j;
 5      vector<vector<int> >mat(lena+1);
 6     for(int i=0;i<=lena;i++)
 7       mat[i].resize(lenb+1,0);
 8     for(i=1;i<=lena;i++){
 9       for(j=1;j<=lenb;j++){
10         if(a[i-1]==b[j-1])
11           mat[i][j]=mat[i-1][j-1]+1;
12         else
13           mat[i][j]=max(mat[i-1][j],mat[i][j-1]);
14         }
15     }
16     i=lena-1;
17     j=lenb-1;
18     int k=0;
19  while(i!=-1&&j!=-1) {
20     if(a[i]==b[j]){
21        sav[k++]=a[i];
22         i--;
23         j--;
24   }
25   else{
26     if(mat[i+1][j+1]==mat[i][j]){
27         i--;
28         j--;
29    }
30    else{
31     if(mat[i][j+1]>=mat[i+1][j]) i--;
32      else j--;
33    }
34   }
35  }
36  return k;
37 }

连续子串

代码:

 1 int LCS(char a[],char b[],char sav[]){
 2     int lena=strlen(a);
 3     int lenb=strlen(b);
 4     int i,j,k=0,x=0;
 5     vector<vector<int> >lcs(lena+1);
 6     for(int i=0;i<=lena;i++)
 7       lcs[i].resize(lenb+1,0);
 8     for(i=1;i<=lena;i++){
 9       for(j=1;j<=lenb;j++)
10         if(a[i-1]==b[j-1]){
11            lcs[i][j]=lcs[i-1][j-1]+1;
12            if(k<lcs[i][j]){
13                x=i;
14                k=lcs[i][j];
15            }
16         }
17     }
18     strncpy(sav,a+(x-k),k);
19     return k;
20 }

时间: 2024-10-26 13:14:39

整理的一些模版LCS(连续和非连续)的相关文章

[pythontip]最大非连续子序列

题目链接:http://www.pythontip.com/coding/code_oj_case/36给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和. 这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻. 例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]). dp首先复制L序列的元素,然后比较前两个元素,确定最优解赋值给dp[1]. 1 # L=[2,-3

HDU ACM 4745 Two Rabbits 最长非连续回文子序列

分析:两个不同方向开始跳跃,跳过数字相同,就相当于求回文子序列了.用dp求出从一个位置到另一个位置的最长回文子序列,相当于把[1-n]分成区间[1-x]和[x+1,n],结果就是两区间最长回文串子序列之和.枚举中间点i,求出max(dp[1,i]+dp[i+1,n])即得最终结果,回文非连续序列,从前往后,从后往前序列相同,求出区间内最长回文序列,由于是环,分成两部分,1~i,i+1~n,A可从i走到1,然后从n走到i+1,B可从1走到i,从i+1走到n . #include<iostream>

内存非连续分配管理方式

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式. 基本分页存储管理方式 固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低.我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位.每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间. 分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部

在论坛中出现的比较难的sql问题:22(字符串拆分、字符串合并、非连续数字的间隔范围、随机返回字符串)

在论坛中看到一个帖子,帖子中有一些sql方面的面试题,我觉得这些面试题很有代表性. 原帖的连接为:http://bbs.csdn.net/topics/390884161?page=1#post-398177057 下面是我的解法,供大家参考: 1.分拆字符串 create table test1 (number varchar(100)) insert into test1 values ('1,2,3,4,5,6') 希望结果: number ------ 1 2 3 4 5 6 (6 行受

最长非连续递减子序列长度&amp;个数

1 int a[100] = {68, 69, 54, 64, 68, 64, 70, 67, 78, 62, 98, 87}; //主序列; 2 int n = 1; //主序列元素个数; 3 int large = 1; //最长非连续递减子序列序列长度; 4 int num = 1; //最长非连续递减子序列序列数量; 5 int fun(int i, int n, int cnt) // i开始下标; n结束下标; cnt已找到递减序列长度; 6 { 7 if(i == n) 8 ret

最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解

问题:最长连续公共子串.最长公共子串(可以非连续).最长回文串(连续).最长回文串(可以不连续).最长递增数组.长方形镶嵌最多的求解 方法:上述问题有相似性,都可以采用动态规划进行求解. (1)最长连续公共子串: 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=0; (2)最长公共子串(可非连续): 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=dp[i-1][j-1]; (3)最长回文

python将list连续元素和非连续元素分开转换为指定字符串

python将list连续元素和非连续元素分开转换为指定字符串贴吧网友提问http://tieba.baidu.com/p/3730249293已知一个由纯数字(顺序由小按大排序)元素组成的列表,比如li=[1,2,3,4,5,7,8,15,20,21,22,23,24,28]写一个函数,让它返回如下的字符串str='1~5,7~8,15,20~24,28'若数字连续,中间部分用 ~ 省略. """黄哥python远程视频培训班https://github.com/pytho

Power BI Power Query 排名1 非连续排名

如下图所示,我有100个分数的数值,现需要对其进行排名处理.很久之前我有写过一篇有关Access里排名处理方式的博文Access SQL实现连续及不连续Rank排名,这一次我将其转换为使用Power Query来进行类似的排名操作. 首先我们来实现非连续排名,非连续排名最终排出来的名次的数字是非连续的,假如第1名1人,第2名有2人,那么名次为3的人事不存在的,而只有从第4名开始.这种模式的计算逻辑是:对于某一个得分而言,其名次为大于当前分数的所有人的个数+1 1.首先我们将Excel表数据导入到

非连续内存分配

非连续分配允许一个程序分散地装入到不相邻的内存分区中,根据分区的大小是否固定分为分页存储管理方式和分段存储管理方式. 基本分页存储管理方式 固定分区会产生内部碎片,动态分区会产生外部碎片,这两种技术对内存的利用率都比较低.我们希望内存的使用能尽量避免碎片的产生,这就引入了分页的思想:把主存空间划分为大小相等且固定的块,块相对较小,作为主存的基本单位.每个进程也以块为单位进行划分,进程在执行时,以块为单位逐个申请主存中的块空间. 分页的方法从形式上看,像分区相等的固定分区技术,分页管理不会产生外部