hdu1159 题目要求两个字符串最长公共子序列,

状态转换方程   f[i][j]=f[i-1][j-1]+1; a[i]=b[j]时

       f[i][j]=MAX{f[i-1][j],f[i][j-1]}  a[i]!=b[j]时

f[i][j]记录a字符串 i 前子串 与 b字符串 j 前子串最长公共子序列  初始化后,自底向上,逐步求解 

动态规划的思想没有搞清楚,递归超时。。犯了很低级的错误

动态规划尽可能地减少重复运算,记忆化搜索很关键

正确代码:

#include<iostream>
#include<string>
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
char a[],b[];
int f[][];
int re;
int main()
{
int lena, lenb,i,j,re;
while(scanf("%s%s", a,b)!=EOF)
{
lena=strlen(a);
lenb=strlen(b);
for(i=; i<=lena; i++)
f[i][]=;
for(j=; j<=lenb; j++)
f[][j]=;
for(i=; i<=lena; i++)
for(j=;j<=lenb; j++)
if(a[i-]==b[j-])f[i][j]=f[i-][j-]+;
else
f[i][j]=MAX(f[i-][j],f[i][j-]);
cout<<f[lena][lenb]<<endl;
}return ;
}

递归超时代码贴在这里,给自己警示一下!!!!!!

#include<iostream>
#include<string>
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
string a,b;
int final(int la, int lb, int re)
{
if(la<0 || lb<0)return re;
if(a[la]==b[lb]) re=final(la-1,lb-1,re+1);
else
re=MAX(final(la-1,lb,re),final(la,lb-1,re)); return re;
}
int main()
{ int lena, lenb;
while(cin >> a >> b)
{
lena=a.length();
lenb= b.length();
cout<<final(lena-1,lenb-1,0)<<endl;
}return 0;
}

  先前wa了的代码,求测试数据,顺便贴过来,回来有空再回来瞅瞅。。现在有点乱了

#include<iostream>
#include<string>
#define find(c,n) find_first_of(c,n)
#define MAX(a,b) ((a)>(b)?(a):(b))
using namespace std;
int d[];
int re[];
int main()
{
string a,b;
int i,j,k,p,len,max,num[]; while(cin >> a >> b)
{
//cin >> a >> b;
memset(d,,sizeof(d));
memset(re,,sizeof(re));
memset(num,,sizeof(num));
len = b.length();
for (i=; i<len; i++)
//cout <<a.find_first_of(b[i],0)<<endl;
{
k=b[i]-'a';
p=a.find(b[i],num[k]);
if(p==string::npos)
d[i]=-;
else d[i]=p,num[k]=p+;
}
//for(i=0;i<len; i++)cout << d[i] << " ";cout <<endl;
for(i=;i<len; i++)if(d[i!=-])re[i]=;
for(i=; i<len; i++ )
{
if(d[i]==){re[i]=;continue;};
int f=;
for(j=i-;j>= ;j--)
if(d[i]>d[j])re[i]=MAX(re[i],re[j]+),f=;
if(!f)re[i]=; }
//for(i=0;i<len; i++)cout << re[i] << " ";cout <<endl;
max=re[];
for(i=; i<len; i++)
max=MAX(max,re[i]);
cout << max << endl;
}return ;
}

动态规划---最长公共子序列 hdu1159的更多相关文章

  1. LCS最长公共子序列HDU1159

    最近一直在学习算法,基本上都是在学习动态规划以及字符串.当然,两者交集最经典之一则是LCS问题. 首先LCS的问题基本上就是在字符串a,b之间找到最长的公共子序列,比如 YAOLONGBLOG 和 Y ...

  2. 动态规划 - 最长公共子序列(LCS)

    最长公共子序列也是动态规划中的一个经典问题. 有两个字符串 S1 和 S2,求一个最长公共子串,即求字符串 S3,它同时为 S1 和 S2 的子串,且要求它的长度最长,并确定这个长度.这个问题被我们称 ...

  3. 算法导论-动态规划(最长公共子序列问题LCS)-C++实现

    首先定义一个给定序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果,其形式化定义如下:给定一个序列X = <x1,x2 ,..., xm>,另一个序列Z =<z1,z2  ...

  4. 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串

    LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...

  5. 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)

    From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...

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

    题目: 求解两个字符串的最长公共子序列.如 AB34C 和 A1BC2   则最长公共子序列为 ABC. 思路分析:可以用dfs深搜,这里使用到了前面没有见到过的双重循环递归.也可以使用动态规划,在建 ...

  7. 动态规划———最长公共子序列(LCS)

    最长公共子序列+sdutoj2080改编: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/ ...

  8. 动态规划——最长公共子序列LCS及模板

    摘自 https://www.cnblogs.com/hapjin/p/5572483.html 这位大佬写的对理解DP也很有帮助,我就直接摘抄过来了,代码部分来自我做过的题 一,问题描述 给定两个字 ...

  9. 动态规划——最长公共子序列&&最长公共子串

      最长公共子序列(LCS)是一类典型的动归问题. 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A ...

随机推荐

  1. 《sort帮你排序》-linux命令五分钟系列之二十六

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  2. Linux Shell脚本之自动修改IP

    作为一名Linux SA,日常运维中很多地方都会用到脚本,而服务器的ip一般采用静态ip或者MAC绑定,当然后者比较操作起来相对繁琐,而前者我们可以设置主机名.ip信息.网关等配置.修改成特定的主机名 ...

  3. 初用jquery

    ---恢复内容开始--- 这两天在顶顶大人的指导下,利用jquery框架做了一个动态切换的小页面.最终效果图: 这么萌萌哒的图片让我觉得一直在测试也没那么累.实现功能如下: 1.打开页面时,自动切换, ...

  4. javascript 单行向上滚动文字

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  5. mac中的xampp配置xdebug

    [xdebug] zend_extension=/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-20121212/ ...

  6. node 无解回调 有解了

    http://cssor.com/javascript-workflow-by-tofishes.html

  7. 开源搜索引擎Sphinx 中启动多个搜索进程的方法

    http://blog.163.com/yang_jianli/blog/static/1619900062010316504471/ 要在同一机器上启动多个sphinx搜索进程searchd,必须为 ...

  8. nRF52系列——nRF52832来袭

    nRF52系列——nRF52832来袭 Nordic凭借着在无线技术的数十年深耕,推出第一个μBlue芯片-- nRF8001.其低功耗等特性在当时吸引了无数厂商的目光,并将这产品应用到多个领域,再之 ...

  9. Swift与Objective-C的兼容“黑魔法”:@objc和Dynamic

    Cocoa框架早已烙上了不可磨灭的OC印记,而无数的第三方库都是用OC写成的,这些积累无论是谁都不能小觑.苹果采取了允许开发者在同一个项目中同时使用Swift和OC进行开发的做法,但要想实现互通,又需 ...

  10. c#中struct和class的区别 z

    1.struct 是值类型,class是对象类型 2.struct 不能被继承,class可以被继承 3.struct 默认的访问权限是public,而class默认的访问权限是private. 4. ...