LCS问题,又称最长公共子序列问题,是DP中较简单的一种,今天我们就来简单讲解一下。

设s1:AEGLEGLLELGEL

设s2:LREGELGEGLEG

求两个字符串的最大公共子序列长度

输出:8

dp[i][j]表示匹配到s1的前i个与s2的前j个所得到的最大公共子序列长度。

转移方程:

    dp[i][j]=0 (i==0||j==0)

    dp[i][j]=max(dp[i-1][j-1]+same(i,j),max(dp[i-1][j],dp[i][j-1]));

    same(i,j)=(s1[i]==s2[j]?1:0)

来看一道题目(HDU1243)

题意:求两个字符串的最大公共子序列的长度

分析:dp,匹配到时加上字母相同的权值

//公共子序列问题
//dp[i][j]表示前s1的前i个与s的前j个匹配得到的最大公共子序列
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,value[],dp[][];
char s1[],s2[]; int main()
{
while(scanf("%d",&n)!=-)
{
scanf("%s",s1+);
for(int i=;i<=n;++i) scanf("%d",&value[s1[i]]);
scanf("%s",s1);getchar();
scanf("%s",s2);
//memset(dp,0,sizeof(dp));
int len1=strlen(s1),len2=strlen(s2);
for(int i=;i<=len1;++i) dp[i][]=;
for(int i=;i<=len2;++i) dp[][i]=;
for(int i=;i<len1;++i)for(int j=;j<len2;++j)
{
dp[i+][j+]=max(dp[i][j]+((s1[i]==s2[j])?value[s1[i]]:),max(dp[i][j+],dp[i+][j]));
}
printf("%d\n",dp[len1][len2]);
}
}

如果是输出最大公共子序列呢?

只需再加入一个数组f[i][j]记录匹配的情况

    f[i][j]=0 (s1[i]==s2[j])

    f[i][j]=1 (dp[i][j+1]>dp[i+1][j])

    f[i][j]=2 (dp[i][j+1]<=dp[i+1][j])

还是HDU1243

input

4

abcd

1 1 1 1

abcabcabc

dacdbdb

output

acbb

4

//公共子序列问题
//dp[i][j]表示前s1的前i个与s的前j个匹配得到的最大公共子序列
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int n,value[],dp[][],f[][] ;
char s1[],s2[]; void out(int x,int y)
{
if(x==||y==) return ;
if(f[x][y]==)
{
out(x-,y-);
printf("%c",s1[x-]);
}
else if(f[x][y]==) out(x-,y);
else out(x,y-);
}
int main()
{
while(scanf("%d",&n)!=-)
{
scanf("%s",s1+);
for(int i=;i<=n;++i) scanf("%d",&value[s1[i]]);
scanf("%s",s1);getchar();
scanf("%s",s2);
//memset(dp,0,sizeof(dp));
int len1=strlen(s1),len2=strlen(s2);
for(int i=;i<=len1;++i) dp[i][]=;
for(int i=;i<=len2;++i) dp[][i]=;
for(int i=;i<len1;++i)for(int j=;j<len2;++j)
{
if(s1[i]==s2[j]){dp[i+][j+]=dp[i][j]+value[s1[i]];f[i+][j+]=;}
else
{
f[i+][j+]=((dp[i][j+]>dp[i+][j])?:);
dp[i+][j+]=max(dp[i][j+],dp[i+][j]);
}
}
out(len1,len2);
puts("");
printf("%d\n",dp[len1][len2]);
}
}

最大公共子串问题

这个问题是LCS的变形,较简单

dp[i][j]表示匹配到s1的前i个与s2的前j个所得到的最大公共子串长度。

    dp[i][j]=dp[i-1][j-1]+1 (s1[i]==s2[j])

    dp[i][j]=0 (s1[i]!=s2[j])

如果要输子串就记录最大长度时的位置,然后往回输出即可

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int max_len,dp[][],t,len1,len2;
char s1[],s2[];
int main()
{
for(scanf("%d",&t);t--;)
{
scanf("%s%s",s1,s2);
len1=strlen(s1),len2=strlen(s2);
max_len=;
for(int i=;i<=len1;++i) dp[i][]=;
for(int i=;i<=len2;++i) dp[][i]=;
for(int i=;i<=len1;++i)for(int j=;j<=len2;++j)
{
if(s1[i-]==s2[j-]) dp[i][j]=dp[i-][j-]+;
else dp[i][j]=;
max_len=max(max_len,dp[i][j]);
}
printf("%d\n",max_len);
}
}

【算法小总结】LCS问题&&HDU1243的更多相关文章

  1. for循环之初学者N多算法小练习

    for循环之初学者N多算法小练习 显示1到100的数,每行显示5个. for (int i=1;i<=100;i++){     if (i%5==0){         System.out. ...

  2. 算法小练#1 - Dany Yang

    开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")& ...

  3. 笔试算法稳了,GitHub 50k Star《labuladong的算法小抄》

    秋招算法有救了!!! 前不久在 GitHub 出现了一个手把手带你刷 LeetCode 的项目:fucking-algorithm. 该项目此前在 GitHub 开源后,连续多次霸榜 GitHub T ...

  4. Github优质库分享-01算法小抄 基于LeetCode

    Github 优质库分享-01 算法小抄 该库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌. 目前 sta ...

  5. labuladong 算法小抄

    <labuladong的算法小抄官方完整版> 本书目前可以手把手带你解决 110 道 LeetCode 算法问题,而且在不断更 新,全部基于 LeetCode 的题目,涵盖了所有题型和技巧 ...

  6. 莫队算法-小Z的袜子

    小Z的妹子袜子这道题用的是莫队算法,据说解决离线区间询问几乎无敌. 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于 ...

  7. java算法小知识练习

    偶尔翻开了以前的练习题,不自觉又想随手敲一遍,虽然有些思想依然是那么老套,但毕竟也算是对知识的巩固 了. 一.题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 具体 ...

  8. 用ES6巧妙的解决传统面试中的算法小问题!

    最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1; ...

  9. Java 实现的各种经典的排序算法小Demo

    由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排 ...

随机推荐

  1. SUSE linux使用zypper 安装软件-比yum更好用

    1. How to install "wget" command in Linux and how to use multiple : https://www.cyberciti. ...

  2. 自定义mvc

    1. 什么是MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 它是一种软件设计典范,用一种业务逻辑.数据. ...

  3. CSS 空中飘动的云动画

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 猫猫学iOS 之微博项目实战(2)微博主框架-自己定义导航控制器NavigationController

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 一:加入导航控制器 上一篇博 ...

  5. B+树在NTFS文件系统中的应用

    B+树在NTFS文件系统中的应用 flyfish 2015-7-6 卷(volume) NTFS的结构首先从卷開始. 卷相应于磁盘上的一个逻辑分区,当你将一个磁盘或者磁盘的一部分格式化成NTFS,卷将 ...

  6. Idea 13 新建maven项目

    1.此时生成的maven项目没有web文件夹 file→New Project→Maven→Next→GID.AID (NewDemo)→Next→ProjectName(NewDemo)→Finis ...

  7. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

  8. HTML5_路径

    <!DOCTYPE html> <hmtl> <html  lang="zh-cn"> <head> <meta charse ...

  9. xcode10的那些事

    前言 这里主要介绍一下Xcode10 版本主要更新的内容.随着iOS12的发布,Xcode10已经可以从Mac App Store下载.Xcode10包含了iOS12.watchOS 5.macOS1 ...

  10. struts2的一些小问题

    1.action和ValueStack的关系2.ValueStack的类set()方法和setValue()方法的区别3.ValueStack的类push()方法的作用4.从ValueStack对象中 ...