• 最长公共子序列(动态规划)


    时限: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\n");

    输入样例:

    programming

    contest

    输出样例:

    2

    输入样例:

    ammbcdefg

    abcfgde

    输出样例: 4

    #include<stdio.h>
    #include<string.h>
    char Arr[201],Brr[201];//A[0~200],B[0~200]
    int n1,n2;
    void search()
    {
        int i,j;
        int List[201][201];//A,B长度范围在0~200之间
        for(i=0;i<=n1;i++)//A长度为i,B长度为0
            List[i][0]=0;
        for(j=0;j<=n2;j++)//A长度为0,B长度为j
            List[0][j]=0;
        for(i=1;i<=n1;i++)
        {    for(j=1;j<=n2;j++)
            {   if(Arr[i-1]==Brr[j-1])//Arr[]从下标0开始与Brr[]匹配
                    List[i][j]=List[i-1][j-1]+1;//匹配结果数组从1开始计算起
                else
                {    if(List[i-1][j]>List[i][j-1])
                        List[i][j]=List[i-1][j];
                    else
                        List[i][j]=List[i][j-1];
                }
            }
        }
        printf("%d\n",List[n1][n2]);//得到长度为n1的A与长度为n2的B的最长公共子序列
    }
    int main()
    {
        gets(Arr);
        gets(Brr);
        n1=strlen(Arr);
        n2=strlen(Brr);
        search();
        return 0;
    }
  • 相关阅读:
    如何使用go module导入本地包
    gin-vue-admin 03 项目打包上线
    golang map转xml
    vim简明文档
    goframe gf-cli的使用
    supervisor 的安装与使用
    element Tree 树形控件
    gin-vue-admin开发教程 02 了解项目目录结构和代码执行的流程
    gin-vue-admin开发教程 01安装与启用
    oraclesql遇见的问题(一)
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2586243.html
Copyright © 2020-2023  润新知