zoukankan      html  css  js  c++  java
  • 最长公共字序列.cpp

    <span style="color:#993399;">/*
    By yuan
    2014/6/21
    At nwpu.xf
    
    
    1041.最长公共子序列
    时限:1000ms 内存限制:200000K  总时限:3000ms
    描述
    一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个严格递增的下标序列 <i1, i2,…, ik>,使得对于所有j=1,2,…,k有:
    
    
    Xij = Zj
    
    
    如果一个序列S即是A的子序列又是B的子序列,则称S是A、B的公共子序列。
    求A、B所有公共子序列中最长的序列的长度。
    
    
     
    输入
    输入共两行,每行一个由字母和数字组成的字符串,代表序列A、B。A、B的长度不超过200个字符。
     
    输出
    一个整数,表示最长各个子序列的长度。
    格式:printf("%d
    ");
     
    输入样例
    programming
    contest
    
    
     
    输出样例
    2
    
    
     
    提示
     
    来源
    */
    #include<iostream>
    #include<stdio.h>
    
    
    #include<stdlib.h>
    #include<string.h>
    using namespace std;
    char a[201],b[201];
    int sum[201][201];
    int la,lb;
    void slove()
    {int i,j;
        for(i=1;i<=la;i++)
           for(j=1;j<=lb;j++)
             {
                 if(a[i]==b[j])
                    sum[i][j]=sum[i-1][j-1]+1;
                else if(sum[i-1][j]>=sum[i][j-1])
                    sum[i][j]=sum[i-1][j];
                else
                    sum[i][j]=sum[i][j-1];
             }
    }
    
    
    int main()
    {int i,j;
        memset(a,'0',201);
        memset(b,'0',201);
        memset(sum,0,201*201);
        for(i=1;;i++){
           scanf("%c",&a[i]);
           if(a[i]=='
    ') break;}
           la=i-1;
        for(j=1;;j++){
            scanf("%c",&b[j]);
            if(b[j]=='
    ') break;}
            lb=j-1;
        slove();
        cout<<sum[la][lb]<<endl;
        return 0;
    }</span>


  • 相关阅读:
    php mysql与mysqli 区别
    让IT工作者过度劳累的12个坏习惯
    HR不懂爱,他的问题答不上来
    励志小故事
    php中如何把一个数字字符串作为一个变量
    新手应该具备的基本素质
    邮件中的缩写
    强大的网页性能测试工具Speed Tracer
    Windows环境下EditPlus运行Perl程序
    ActionScript3检测当前下载资源的速度
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254552.html
Copyright © 2011-2022 走看看