想了挺久到底第一篇在这儿的博客写什么好,刚好这两天又一次看到动态规划的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. 发现保存GIF格式后相素发生变化咋办

    数学公式编辑器MathType主要的作用就是编辑公式用的,一些用户朋友编辑完公式希望把公式保存为“高分辨率”的GIF格式,但是在图片查看器中进行浏览查看时发现GIF的分辨率发生了变化,对于这种情况该如 ...

  2. MySQL的limit子句

    1.理解: limit用来取结果集中的固定几条记录 2.参数: limit offset,pagesize offset:偏移量,为0时,可以省略 pagesize:每页显示的行数,通常是固定的 0表 ...

  3. iOS Document Interaction 编程指南

    本文转载至 http://www.2cto.com/kf/201306/219382.html iOS支持在你的app中用其他app预览和显示文档.iOS还支持文件关联,允许其他app通过你的程序打开 ...

  4. 《从零开始学Swift》学习笔记(Day 45)——重写方法

    原创文章,欢迎转载.转载请注明:关东升的博客 重写实例方法 在子类中重写从父类继承来的实例方法和静态方法.先介绍实例方法的重写. 下面看一个示例: class Person { var name: S ...

  5. ACM至大二省赛小结

    大一进acm坑的,大一上就学了个c,下才学c++,不过 c 学完后学 c++ 感觉很简单,应该是大一下开学左右才开始刷题的,前面都在水???然后因为acm协会有各种月赛校赛什么的,班主任的提醒较多,所 ...

  6. Django中_Meta 部分用法

    周一了,就不长篇大论了,给大家分享一个很实用的知识点,希望大家周末过得开心,愉快,诗和远方在等着你们.而我还在苦逼的撸代码,只为了应付眼前的苟且! model.UserInfo._meta.app_l ...

  7. DOM 常见事件

    onclick //当用户点击某个对象时调用的事件句柄. ondblclick //当用户双击某个对象时调用的事件句柄. onfocus //元素获得焦点. onblur //元素失去焦点. 应用场景 ...

  8. python cookbook第三版学习笔记二十:可自定义属性的装饰器

    在开始本节之前,首先介绍下偏函数partial.首先借助help来看下partial的定义 首先来说下第一行解释的意思: partial 一共有三个部分: (1)第一部分也就是第一个参数,是一个函数, ...

  9. (4.11)sql server内存使用

    一些内存使用错误理解   开篇小感悟 在实际的场景中会遇到各种奇怪的问题,为什么会感觉到奇怪,因为没有理论支撑的东西才感觉到奇怪,SQL Server自己管理内存,我们可以干预的方式也很少,所以日常很 ...

  10. Django of python 中文文档 及debug tool

    http://python.usyiyi.cn/django/index.html http://www.ziqiangxuetang.com/django/django-views-urls.htm ...