【算法小总结】LCS问题&&HDU1243
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的更多相关文章
- for循环之初学者N多算法小练习
for循环之初学者N多算法小练习 显示1到100的数,每行显示5个. for (int i=1;i<=100;i++){ if (i%5==0){ System.out. ...
- 算法小练#1 - Dany Yang
开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")& ...
- 笔试算法稳了,GitHub 50k Star《labuladong的算法小抄》
秋招算法有救了!!! 前不久在 GitHub 出现了一个手把手带你刷 LeetCode 的项目:fucking-algorithm. 该项目此前在 GitHub 开源后,连续多次霸榜 GitHub T ...
- Github优质库分享-01算法小抄 基于LeetCode
Github 优质库分享-01 算法小抄 该库总共 60 多篇原创文章,都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌. 目前 sta ...
- labuladong 算法小抄
<labuladong的算法小抄官方完整版> 本书目前可以手把手带你解决 110 道 LeetCode 算法问题,而且在不断更 新,全部基于 LeetCode 的题目,涵盖了所有题型和技巧 ...
- 莫队算法-小Z的袜子
小Z的妹子袜子这道题用的是莫队算法,据说解决离线区间询问几乎无敌. 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于 ...
- java算法小知识练习
偶尔翻开了以前的练习题,不自觉又想随手敲一遍,虽然有些思想依然是那么老套,但毕竟也算是对知识的巩固 了. 一.题目:有1.2.3.4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 具体 ...
- 用ES6巧妙的解决传统面试中的算法小问题!
最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1; ...
- Java 实现的各种经典的排序算法小Demo
由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排 ...
随机推荐
- msp430入门编程21
msp430中C语言的扩展--#pragma编译命令
- Gearman 初窥【转载】
Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于Live ...
- 11-Js类和对象
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python开发的一个IDE推荐,Sublime Text 3
Sublime Text 3 官网下载地址为, LINK. 目前最新版本是3114. 这里转载泱泱长空的授权文件(注册码)文章[1],将几个可以用的注册码列举如下: 补充:2016.05 最近经过测试 ...
- spring mvc get请求也可以接受DTO对象
spring mvc get请求也可以接受DTO对象,比如:url上面你还是将参数&符号连接起来,并自动封装进一个DTO对象里. 只有@RequestBody注解spring mvc才会从ht ...
- Meteor在手机上运行
在本章中,我们将学习如何在Android设备上运行你的应用程序.最近Meteor刚刚添加此功能适用于Windows操作系统,所以我们需要更新 Meteor 应用到 1.3测试版. 注 在写的时候本教程 ...
- Java 8 中的 java.util.Optional
Java 8 中的 java.util.Optional 学习了:https://blog.csdn.net/sun_promise/article/details/51362838 package ...
- Android MediaRecorder录音与播放
上一篇讲到了使用意图录音.这篇文章将使用MediaRecorder类来录音,从而提供很多其它的灵活性. 效果图: 源码奉上: <LinearLayout xmlns:android=" ...
- Linux - Ubuntu中文输入法安装(Ubuntu 12.04)
Ubuntu中文输入法安装(Ubuntu 12.04) 本文地址:http://blog.csdn.net/caroline_wendy Ubuntu作为Linux常见的操作系统,是须要熟练使用的. ...
- JavaSE----API之集合(Collection、List及其子类、Set及其子类、JDK1.5新特性)
5.集合类 集合类的由来: 对象用于封装特有数据,对象多了须要存储:假设对象的个数不确定.就使用集合容器进行存储. 集合容器由于内部的数据结构不同,有多种详细容器.不断的向上抽取,就形成了集合框架. ...