zoukankan      html  css  js  c++  java
  • 蓝桥杯 最长公共子序列

    给定俩个字符串,S1S2.....Sn和T1T2......Tn。求出这俩个字符串中最长的公共子序列的长度。字符串S1S2......Sn的子序列指可以表示Si1Si2.......Sim的序列

    /* 
    *最长公共子序列 ,输入俩个序列之后不断检查是否有相同出现
    *如果发现字符相同,则在动态记录数组中加 1
    *如果数组不相同,则选择记录 a数组减 1最大,或者选择 b数组子序列 减 1最大 
    * 
    */ 
    #include<stdio.h>
    #include<string.h>
    int N,M;
    int dp[100][100];
    char a[100],b[100];
    int max(int n,int m){
    return n>m?n:m;
    }
    void f(){
    for(int i=0;i<N;i++)
    for(int j=0;j<M;j++){
    if(a[i]==b[j])    dp[i+1][j+1]=dp[i][j]+1;
    else
    dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]); 
    }
    printf("%d",dp[N][M]);
    }
    int main(){
    memset(dp,0,sizeof(dp));
    scanf("%d%d",&N,&M);
    getchar();
    for(int i=0;i<N;i++)
    scanf("%c",&a[i]);
    getchar();
    for(int j=0;j<N;j++){
    scanf("%c",&b[j]);
    }
    f();
    return 0;
    }
    
     
    
    /***************************************************/
    
    #include<stdio.h>
    #include<string.h>
    int N,M;
    int dp[100][100];
    char a[100],b[100];
    int max(int n,int m){
    return n>m?n:m;
    }
    int rec(int i,int j){
    if(dp[i][j]>=0) return dp[i][j];
    int res=0;
    if(i==N || j==M)
    return 0;    
    else if(a[i]==b[j]) res=rec(i+1,j+1)+1;  //向后寻找并且 res+1
    else
    res=max(rec(i+1,j),rec(i,j+1));        //背包的核心 ,前面的最大倒推回来之后一定是当前的最大
    return dp[i][j]=res;
    }
    int main(){
    memset(dp,-1,sizeof(dp));
    scanf("%d%d",&N,&M);
    getchar();
    scanf("%s",a);
    getchar();
    scanf("%s",b);
    printf("%d
    ",rec(0,0));
    return 0;
    }
  • 相关阅读:
    Godaddy注册的域名转发、转向教程
    Flash的attachMovie方法
    js出现中文乱码及VS打开js文件乱码的解决方法
    sql2005 COM+ 目录要求 (警告)
    flash读取不同格式xml
    Flash xml 中文乱码
    IXWebHosting的URL转向设置
    引用项目类库时dll.refresh文件的影响
    flash自定义函数
    Microsoft SQL Server 2005 整合、集成SP3方法
  • 原文地址:https://www.cnblogs.com/sky-z/p/4411043.html
Copyright © 2011-2022 走看看