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>


  • 相关阅读:
    Golang里边的map变量是什么?
    Golang map的底层实现
    方法和函数的区别
    Golang 对 对象和指针 的理解
    React 部分
    前端开发概述、html、css基础
    服务器核心知识
    常用模块8.7
    2017.8.2迭代器和生成器
    2017.7.18可变/不可变类型,符号运算及其流程控制
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254552.html
Copyright © 2011-2022 走看看