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


    时限: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;
    }
  • 相关阅读:
    HDU 1849 Rabbit and Grass
    HDU 1848 Fibonacci again and again
    HDU 1847 Good Luck in CET-4 Everybody!
    HDU 1846 Brave Game
    HDU 1387 Team Queue
    HDU 1870 愚人节的礼物
    HDU 1509 Windows Message Queue
    HDU 4381 Grid
    HDU 5800 To My Girlfriend
    HDU 5806 NanoApe Loves Sequence Ⅱ
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2586243.html
Copyright © 2020-2023  润新知