想了挺久到底第一篇在这儿的博客写什么好,刚好这两天又一次看到动态规划的LCS算法觉得还是有点意思的,就拿来写了写,第一篇博客就发它吧。

#include<iostream>
#include<iomanip>
using namespace std;
//tag标志,0为左斜上,1取左,2取上;count为最长公共子序列计数
//计算最长公共子序列长度
void LCS_Length(char *X, char *Y, int *count[],int *tag[],int length_X, int length_Y)
{
//第一排第一列全部是0
for (int i = ; i < length_X+; i++)
{
count[i][] = ;
}
for (int i = ; i < length_Y+; i++)
{
count[][i] = ;
} for (int i = ; i <= length_X; i++)
{
for (int j = ; j <= length_Y; j++)
{
if (X[i-] == Y[j - ])
{
count[i][j] = count[i-][j-]+;
tag[i][j] = ;
}
//否则取较大的值
else if(count[i-][j] > count[i][j-])
{
count[i][j] = count[i-][j];
tag[i][j] = ;
}
else
{
count[i][j] = count[i][j-];
tag[i][j] = ;
}
}
}
}
//打印最长公共子序列元素
void Print_LCS(int *tag[],char *X,int Length_X, int Length_Y)
{
if (Length_X == || Length_Y == )
{
return ;
}
int i = Length_X, j = Length_Y;
if (tag[i][j] == )
{
cout<<X[i-]<<setw();
Print_LCS(tag,X,i-,j-);
}
else if(tag[i][j] == )
{
Print_LCS(tag,X,i-,j);
}
else
{
Print_LCS(tag,X,i,j-);
}
} int main()
{
//先人为设置两个序列
char *X = "BDCABA";
char *Y = "ABCBDA";
int *count[];
for (int i = ; i < ; i++)
{
count[i] = new int[]; //因为第一行第一列全为0,所以总共七行七列
}
int *tag[];
for (int i = ; i < ; i++)
{
tag[i] = new int[];
}
LCS_Length(X,Y,count,tag,strlen(X),strlen(Y));
cout<<"最大子序列数为"<<count[][]<<endl;
/****************************************
for(int i= 0; i <7; i++)
{
for (int j = 0; j < 7; j++)
{
cout<<count[i][j]<<setw(3);
}
cout<<endl;
}
*****************************************/
Print_LCS(tag,X,strlen(X),strlen(Y));
cout<<endl;
return ;
}

  主要函数有两个,一个函数是做出保存最长公共子序列的元素个数的矩阵,这里给出的示例中,两个字符串都各6个字符,所以给出的是7行7列矩阵(第一行第一列全为零)。

另外一个函数即为打印函数,从矩阵右下角一位开始遍历到[0][0]位,凡是遇到tag[i][j]标志为0则将该位的字符打印出来。算法比较简单易懂,具体可以参考《算法导论》。

下面补充说一个问题:二维指针到底怎么用。比如前面的二维数组初始化,如果我希望能够通过字符串的长度来给我的二维数组定义大小,而不是用常数来指定,使得我们可以通过strlen()函数来定义长度,那么就要用到二维指针。

注意:int *Arr[strlen(str)];这种声明方式是不正确的,编译器会提示错误,数组的声明必须使用常量。下面给出正确的示例:

        /***********************************************
//华丽丽的分割线--------------------------------
二维指针到底怎么用
int *(*ptr) = new int*[strlen(X)];
for (int i = 0; i < strlen(X); i++)
{
ptr[i] = new int[strlen(X)];
}
ptr[2][3] = 0;
cout<<ptr[2][3]<<endl;
**********************************************/

最长公共子序列的C++实现---附二维指针的使用方法的更多相关文章

  1. 算法练习——最长公共子序列的问题(LCS)

    问题描述: 对于两个序列X和Y的公共子序列中,长度最长的那个,定义为X和Y的最长公共子序列.X  Y   各自字符串有顺序,但是不一定需要相邻. 最长公共子串(Longest Common Subst ...

  2. (最长公共子序列+推导)Love Calculator (lightOJ 1013)

    http://www.lightoj.com/volume_showproblem.php?problem=1013   Yes, you are developing a 'Love calcula ...

  3. Lintcode--005(最长公共子序列)

    Given two strings, find the longest common subsequence (LCS).     最长公共子序列 Your code should return th ...

  4. 洛谷 P2516 [HAOI2010]最长公共子序列

    题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...

  5. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  6. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  7. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  8. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  9. LintCode 77: 最长公共子序列

    public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...

随机推荐

  1. Struts2 是什么?

    Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架. Struts2不只是Struts1下一个版本,它是一个完全重写的Struts架构. WebWork框架开始以Struts框架为基础 ...

  2. Struts2框架拦截器:

    Struts 2框架提供了良好的预配置,并准备使用的盒拦截.下面列出了几个重要的拦截器: SN Interceptor & 描述 1 aliasAllows parameters to hav ...

  3. day21 os random 序列json

    一.random模块     import random # print(random.random()) #0到1之间数 # print(random.uniform(10,20)) #范围内小数 ...

  4. Gradle5.x打jar包上传maven仓库

    1.上传本地仓库 1.1 build.gradle 项目设置 plugins { id 'java' id 'maven' //引入maven插件 } group 'com.inkyi' //包名 v ...

  5. 网页或WEB应用或PC端浏览器调用百度地图API

    今天在写微网页中遇见了调用百度地图这个问题:在一个容器中显示地图信息如图(设计图截图) 然后在网上查了接口:http://api.map.baidu.com/,就是这个东东,当然不止这个,还有几个必选 ...

  6. UVALive 5873 (几何+思维)

    唉 被秀了... 还是太弱,说好的数形结合呢,列个式子出来后就被吓到了,然后就懵逼了. 题意: 有一条狗,从原点出发,沿n个向量走,每个向量只走一次,沿着一个向量(x,y)走时,既可以往(x,y)方向 ...

  7. 3673: 可持久化并查集 by zky

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 2170  Solved: 978[Submit][Status ...

  8. Java的四种引用,强弱软虚,用到的场景

    众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活).为了解决内存操作不灵活这个问题,可以采用软引用等方法. 在J ...

  9. text files and binary files

    https://en.wikipedia.org/wiki/Text_file https://zh.wikipedia.org/wiki/文本文件

  10. php中定时计划任务的实现原理

    根据php手册简单介绍一些相关的知识: 1.连接处理: 在 PHP 内部,系统维护着连接状态,其状态有三种可能的情况: 0 - NORMAL(正常) 1 - ABORTED(异常退出) 2 - TIM ...