HDU-1159 Common Subsequence(动态规划2)
2015-07-15 11:08
363 查看
Description
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, x ij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
Input
The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.
Output
For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
Sample Input
Sample Output
A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, ..., ik > of indices of X such that for all j = 1,2,...,k, x ij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
Input
The program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct.
Output
For each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line.
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0 x的一个子序列相应于下标序列{1,2,3.....m}的一个子序列,故X共有2^m个子序列,直接爆,需要指数时间。为此,考虑能否用动态规划方法求解。 先找出它是否满足最优子结构性质: 设序列X={x1,...xm}和y={y2,....yn},子序列为z={z1,...zk} (1)如果 xm=yn,则zk=xn=yn;且z(k-1)是x(m-1)和y(n-1)的最长公共子序列。 找出x(m-1)和y(n-1)的最长公共子序列,然后在其尾部加上xm(=yn)即可得x和y的一个最长公共 子序列 (2)如果xm!=yn,且zk!=xm 则z 是x(m-1)和y的最长公共子序列。 如果xm!=yn,且zk!=yn 则z 是x 和y(n-1的最长公共子序列。 找出x(m-1)和y的一个最长公共子序列及x和y(n-1)的最长公共子序列。这两个公共子序列中较长者即为X和Y的一个最长公共子序列。 如 1 2 3 4 7 1 2 4 5 或 1 2 3 4 9 1 2 3 4
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int main() { char a[1001],b[1001]; int n,m,i,j,c[1001][1001]; while(scanf("%s%s",&a,&b)!=EOF) { n=strlen(a); m=strlen(b); if(n==0||b==0) { printf("0\n"); break; } memset(c,0,sizeof(c)); for(i=1; i<=n; i++) { for(j=1; j<=m; j++) { if(a[i-1]==b[j-1]) { c[i][j]=c[i-1][j-1]+1; } else { c[i][j]=max(c[i-1][j],c[i][j-1]); } } } printf("%d\n",c [m]); } return 0; }
相关文章推荐
- SystemUI源码分析
- msql 实现sequence功能增强
- Authentique qualité pour Chaussures hommes air max 90
- js中innerHTML和value的区别
- [LeetCode][Java] N-Queens II
- 实现对象缓存框架三、ZSYCacheQueue
- iOS中视图控制器指定自定义UIView
- 用soapUI做接口级别的功能和性能测试
- easyui datagrid 避免初始化就加载数据
- Ducci Sequence 解题心得
- UITextView 的使用
- Win10 Build 10176游戏兼容完整名单:趋于完美
- GCD入门(一): 基本概念和Dispatch Queue
- sudo: must be setuid root 错误解决方法
- Android UI法宝发展Angrytools
- IOS UITableView 使用总结
- [LeetCode][Java] N-Queens
- RebornDB:下一代分布式Key-Value数据库
- Android RoboGuice
- 学习重点:1、金典的设计模式在实际中应用2、JVM原理3、jui源代码