• dp最长公共子串LCS


    http://acm.hdu.edu.cn/showproblem.php?pid=1159

    这题可用递归解出

    (1)递归方法求最长公共子序列的长度

        1)设有字符串a[0...n],b[0...m],下面就是递推公式。

                 当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。

        

    #include<stdio.h>//会超时 
    #include<string.h>
    char a[100000],b[100000];
    int lena,lenb;
    int LCS(int i,int j)
    {
         if(i>=lena || j>=lenb)
            return 0;
        if(a[i]==b[j])
            return 1+LCS(i+1,j+1);
        else
            return LCS(i+1,j)>LCS(i,j+1)? LCS(i+1,j):LCS(i,j+1);
    }
    int main()
    {
        while(scanf("%s %s",a,b)!=EOF)
        {
           lena=strlen(a);
           lenb=strlen(b);
           printf("%d
    ",LCS(0,0));
        }
        return 0;
    }
    View Code

    但是这样子的方法会超时

    接下来就是动态规划

    (2)动态规划求最长公共子序列的长度

        动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。

        1)最长公共子序列的长度的动态规划方程

        设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。

        

     

    #include<stdio.h>
    #include<string.h> 
    int ans[1000][1000];
    int max(int a,int b)
    {
        return a>b?a:b;
    } 
    int main()
    {
        int i,j,lena,lenb;
        char a[10000],b[10000];
        while(scanf("%s %s",a,b)!=EOF)
        {
           lena=strlen(a);
           lenb=strlen(b);
           for(i=0;i<=lena;i++)
             for(j=0;j<=lenb;j++)
               ans[i][j]=0;//初始化为0 
           for(i=1;i<=lena;i++)
             for(j=1;j<=lenb;j++)
             {
                 if(a[i-1]==b[j-1])//如果都相等,两个指针都前移并将该处的子串长度加一 
                 ans[i][j]=1+ans[i-1][j-1];
                 else ans[i][j]=max(ans[i][j-1],ans[i-1][j]);//否则保留两个子串前个阶段最大的那个 
             }
           printf("%d
    ",ans[lena][lenb]);
        }
        return 0;
    }
    View Code

    还写出了一个错误的代码。。。

    #include<stdio.h>
    #include<string.h> 
    int ans[1000][1000];
    int max(int a,int b)
    {
        return a>b?a:b;
    } 
    int main()
    {
        int i,j,lena,lenb;
        char a[10000],b[10000];
        while(scanf("%s %s",a,b)!=EOF)
        {
           lena=strlen(a);
           lenb=strlen(b);
           for(i=0;i<lena;i++)
             for(j=0;j<lenb;j++)
               ans[i][j]=0;//
           for(i=0;i<lena;i++)
             for(j=0;j<lenb;j++)//
             {
                 if(a[i]==b[j])
                 ans[i+1][j+1]=1+ans[i][j];//
                 else ans[i+1][j+1]=max(ans[i][j+1],ans[i+1][j]);//这里错误,此时二者还都是未知 
             }
           printf("%d
    ",ans[i][j]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Python的命名空间及作用域
    STM32 RTC时钟的配置
    STM32 输入捕获配置
    stm32 看门狗配置
    led灯的驱动电流和电阻
    STM32中TIMx的映射及其通道
    STM32中断定时,控制LED灯
    STM32 用c语言控制4个LED灯从左向右无限流动
    SYSTEMsyssys.c:33:7: error: expected '(' before 'void' __ASM void MSR_MSP(u32 addr)
    STM32 PWM输出(映射)
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3240918.html
Copyright © 2020-2023  润新知