题目描述:求最长公共子序列

若给定序列X={x1,x2,...,xm},另一序列Z={z1,z2,...,zk},是X的子序列是指存在一个严格递增的下标序列{i1,i2,...,ik}使得对所以j=1,2,...,k有zj=x(ij)

例如Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}

分析:DP的经典题

状态表示:d[i,j]记录序列x(i)和y(j)的最长公共子序列,其中x(i)={x1,x2,...,xi},y(j)={y1,y1,...,yj},原问题最优解为d[len1,len2]

转移方程:i=0或j=0时,d[i][j]=0;

xi=yj时,d[i][j]=d[i-1][j-1]+1;

xi != yj 时,d[i][j]=max( d[i-1][j],d[i][j-1] )

 #include<cstdio>
#include<cstring>
int d[][];
int max(int a,int b)
{
return a>b ? a : b;
}
int main()
{
char rank1[],rank2[];
int i,j;
while(gets (rank1+))
{
gets(rank2+);
memset(d,,sizeof(d));
int len1=strlen(rank1+);
int len2=strlen(rank2+);
for(i=; i<=len1; i++)
for(j=; j<=len2; j++)
{
if(rank1[i]==rank2[j])
d[i][j]=d[i-][j-]+;
else
d[i][j]=max(d[i-][j],d[i][j-]);
}
printf("%d\n",d[len1][len2]);
}
return ;
}

最新文章

  1. Redis分布式集群几点说道
  2. 今天我们要说的画一个三角形,恩,画一个三角形,第一种呢是利用我们的html标签结合css来实现;而第二种方法就就是我们的html5新增的一个标签canves,这个canves就是网页画幕,那么顾名思义就是在网页里建造一个画板,用来画画,好,那接下来就和我一起去看看吧!
  3. Android获取ROOT权限
  4. C#-面向对象——如何调用使用类 普通方法、静态方法的使用
  5. 【EF 译文系列】重试执行策略的局限性(EF 版本至少为 6)
  6. iPhone和iPad版本的分辨率a
  7. 解决python3 不能引入setuptools
  8. 关键在封装并发出了帧-IP冲突也无所谓
  9. 【动态规划】【最短路】Codeforces 710E Generate a String
  10. skynet初学
  11. iOS9适配系列教程
  12. Java Object 构造方法的执行顺序
  13. logback配置文件详解
  14. 1014 Uniform Generator
  15. NSString类
  16. OJ周末题
  17. 在js中网页面写入数据时需要注意的几点
  18. 005 Numpy的基本操作
  19. 【Linux】深入理解Linux中内存管理
  20. APP-8-文本语音

热门文章

  1. 编译的时候出现&quot;/usr/bin/ld: cannot find -lz
  2. JavaScript文件中; !function (win, undefined) {}(window);的意义
  3. Http中Content-Type的取值讲解
  4. 数组的includes方法
  5. 多线程06-Lock
  6. 使用Vue开发微信小程序:mpvue框架
  7. Python学习-第三天-面向对象编程基础
  8. redis-Nosql
  9. Python2视频教程
  10. powerdesigner数据库设计