zoukankan      html  css  js  c++  java
  • hdu 1159

    1、题目大意

    我们称序列Z=<z1,z2, ...,zk>是序列X=<x1,x2,...,xm>的子序列当且仅当存在严格上升的序列<i1,i2,...,ik>,使得对j=1,2,...,k, 有xij=zj。比如Z=<a,b,f,c> 是X=<a,b,c,f,b,c>的子序列。
    现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列 Z,使得Z既是X的子序列也是Y的子序列。


    2、对最长公共子序列的感性认识

     


    ,以字符串abcfbc 和 abfcab 为例

    表格中的数字嘛.....姑且解释为子串的最大公共子串的长度.最优子结构这个东西只能意会啊.

    以图中标记的数字为例,它代表 子串  abc 和 abfcab的最长公共子串.

    3、代码如下:

    /*
     * 1159_1.cpp
     *
     *  Created on: 2013年7月31日
     *      Author: 黄东东
     *      为了能有章泽天这样的女朋友而不断努力。。。
     *
     */
    
    #include <stdio.h>
    #include <string.h>
    
    int dp[1005][1005];
    
    int max(int a, int b) {
    	return (a > b) ? a : b;
    }
    
    int main() {
    
    	char stra[1001], strb[1001];//数组要开的足够大,否则会出错
    
    	int i, k;
    	while (scanf("%s%s", stra, strb) != EOF) {
    
    		int m = strlen(stra);
    		int n = strlen(strb);
    
    		memset(dp, 0, sizeof(dp));
    
    		for (i = 1; i <= m; ++i) {
    			for (k = 1; k <= n; ++k) {
    				if (stra[i - 1] == strb[k - 1]) {
    					dp[i][k] = dp[i - 1][k - 1] + 1;
    				} else {
    					dp[i][k] = max(dp[i - 1][k], dp[i][k - 1]);
    				}
    			}
    		}
    
    		printf("%d
    ", dp[m][n]);
    	}
    	return 0;
    }
    

    以下是c++实现。其实都差不多

    /*
     * 1159_2.cpp
     *
     *  Created on: 2013年7月31日
     *      Author: Administrator
     */
    
    #include <iostream>
    
    using namespace std;
    
    int dp[1005][1005];
    
    int max(int a , int b){
    	return (a>b)?a:b;
    }
    int main() {
    
    	string stra, strb;
    
    	while (cin >> stra >> strb) {
    		int m = stra.length();
    		int n = strb.length();
    		for (int i = 1; i <= m; ++i) {
    			for (int k = 1; k <= n; ++k) {
    				if (stra[i - 1] == strb[k - 1]) {
    					dp[i][k] = dp[i - 1][k - 1] + 1;
    				} else {
    					dp[i][k] = max(dp[i - 1][k], dp[i][k - 1]);
    				}
    			}
    		}
    
    
    		cout<<dp[m][n]<<endl;
    	}
    	return 0;
    }
    


  • 相关阅读:
    Q15格式表示负小数
    音频算法处理笔试面试题
    有符号和无符号之间的转化
    PE5 Smallest multiple
    PE3 Largest prime factor(最大素数因子)
    PE2 Even Fibonacci numbers(最大菲波那列偶数)
    PE 4 Largest palindrome product(最大回文)
    PE1 Multiples of 3 and 5
    Codevs高精度入门(减法、加法和乘法)解题报告
    计算机网络学习笔记(二) 计算机网络结构
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3228811.html
Copyright © 2011-2022 走看看