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. discuz注册 内部错误

    ucenter整合后,在论坛注册时出现 内部错误,无法显示,这是因为ucenter中,某个appid没写入! 可以把ucenter安装包下的utilities/checkappid.php,复制到uc ...

  2. C# Thread多线程学习

    自我学习理解:一个程序中包括多个进程,每个进程包括多个线程,多个线程可同时做不同的事情(说是同时,但它是交换执行的,人感觉像是同时罢了). 优点:提高CPU的使用率. 线程同步:同步就是指一个线程要等 ...

  3. HTML 表单和表格

    1.使用表单标签 网站使用 HTML 表单可与用户进行交互,表单元素是允许用户在表单中输入内容,比如:文本框.文本域.单选框.复选框.下拉列表.按钮等等,表单可以把浏览者输入的数据传送到服务器端,这样 ...

  4. Python冒泡排序

    冒泡排序,顾名思义,按照一定的规则,把数据一直排下去 直接上代码 import random def bubblesort(data): for i in range(len(data)-1,1,-1 ...

  5. Codeforces Problem 598E - Chocolate Bar

    Chocolate Bar 题意: 有一个n*m(1<= n,m<=30)的矩形巧克力,每次能横向或者是纵向切,且每次切的花费为所切边长的平方,问你最后得到k个单位巧克力( k <= ...

  6. 粘滞位(sticky bit)

    linux特殊权限:setUid, setGid, 粘着位(sticky) (1)目录的X权限(执行) 文件的可执行权限很简单,也就是可否执行它的意思,但目录的执行权限又代表什么意思呢? 当然不可能是 ...

  7. MYSQL数据库备份与恢复【转】

    mysqldump -h主机名  -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql  在window上需要通过CMD进入mysql安装目录下的bin目录下执行 ...

  8. 转:PHP – Best Practises

    原文来自于:http://thisinterestsme.com/php-best-practises/ There are a number of good practises that you s ...

  9. IP工具类——IpAddress.java

    根据IP地址获取详细的地域信息,也可通过 http://whois.pconline.com.cn/ 获取地址信息. 源码如下:(点击下载  IpAddress.java) import java.i ...

  10. python中的单下划线和双下划线意义和作用

    Python中并没有真正意义上的“私有”,类的属性的的可见性取决于属性的名字(这里的属性包括了函数).例如,以单下划线开头的属性(例如_spam),应被当成API中非公有的部分(但是注意,它们仍然可以 ...