• 最长公共字序列.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>


  • 相关阅读:
    Linux内核分析作业六
    课本第三章读书笔记
    课本第十八章读书笔记
    Linux内核分析作业五
    课本第五章读书笔记
    MSF MS11-050/10-087/Adobe攻击实践及内存保护技术
    Linux课题实践五——字符集总结与分析
    Linux课题实践四——ELF文件格式分析
    Linux课题实践三——程序破解
    实践二——内核模块
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254552.html
Copyright © 2020-2023  润新知