最长公共子序列!!!!!HDOJ-1159
来源:互联网 发布:sap offer知乎 编辑:程序博客网 时间:2024/05/05 04:21
郁闷啊,今天做中南的比赛突然发现这样的题,居然忘记怎么做了
在此做下解题报告记录下,以此为鉴
2
0
题目意思就不解释了
注意for那里不要用strlen函数,要先用个变量存下来,不然会超时
在此做下解题报告记录下,以此为鉴
Sample Input
abcfbcabfcab
programming contest
abcd mnp
programming contest
abcd mnp
Sample Output
42
0
题目意思就不解释了
算法当然是DP啊
状态转移方程式:
f(i,j)=f(i-1,j-1)(a[i]==b[j])
f(i,j)=max(f(i-1,j),f(i,j-1))(a[i]!=b[j])
由于f(i,j)只和f(i-1,j-1),f(i-1,j)和f(i,j-1)有关,而在计算f(i,j)时,只要选择一个合适的顺序,就可以保证这三项都已经计算出来了,这样就可以计算出f(i,j).这样一直推到f(len(a),len(b))就得到所要求的解了
讲解的地方就直接复制粘贴了= =
代码如下:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>int f[1005][1005];int max(int a,int b){ return a>b?a:b;}int main(){ char a[1005],b[1005];int i,j,k,lenx,leny; while(scanf("%s%s",a,b)!=EOF) { lenx=strlen(a); leny=strlen(b); for(i=0;i<lenx;i++) f[0][i]=0; for(i=0;i<leny;i++) f[i][0]=0; for(i=0;i<lenx;i++) { for(j=0;j<leny;j++) { if(a[i]==b[j]) f[i+1][j+1]=f[i][j]+1; else f[i+1][j+1]=max(f[i+1][j],f[i][j+1]); } } printf("%d\n",f[lenx][leny]); }}
注意for那里不要用strlen函数,要先用个变量存下来,不然会超时
- 最长公共子序列!!!!!HDOJ-1159
- hdoj 1159最长公共子序列
- HDOJ 1159 Common Subsequence(最长公共子序列)
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- hdu rightmost digit 1061
- CSU 5月月赛B题
- jira中级使用说明(节选)
- 生成图片缩略图
- zTree 异步加载 添加子节点重复问题
- 最长公共子序列!!!!!HDOJ-1159
- C++沉思录代理类
- Linux命令行下利用tar gzip bzip2工具打包、压缩
- 堆与栈
- 公式之类的
- Jquery easyui中tabs新建标签设置href会提交两次请求
- Codeforces Round #119 (Div. 2) A. Cut Ribbon
- 1401 poj Factorial
- 黑马程序员-----java基础回顾