zoukankan      html  css  js  c++  java
  • hdu1159 dp(最长公共子序列)

    题意:给两个字符串,求这两个字符串的最长公共子序列的长度

    因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊```

    解法就是通过两个字符串的每个字符互相比较,根据比较情况相同与否确定递推关系:

    dp [ i + 1 ] [ j + 1 ] 表示匹配到 a 字符串的第 i 个字符和 b 字符串的第 j 个字符时的最大匹配数,由于读字符串的时候我是从下标 0 读起的,但我需要用 dp [ 0 ] ,所以就都是加了一,否则也可以读入的时候直接从 a + 1 和 b + 1 读起。

    当匹配到 a [ i ] 与 b [ j ] 时,若相等,则 dp [ i + 1 ] [ j + 1 ] = dp [ i ] [ j ] +1,即在匹配完 a [ i - 1 ] 和 b [ j - 1 ] 时的最大值再加上 1 组匹配;

    若不相等,则 dp [ i + 1 ] [ j + 1 ] = max ( dp [ i + 1 ] [ j ] , dp [ i ] [ j + 1 ] )。

    这样 dp 到最后就得出了结果。

     

     1 #include<stdio.h>
     2 #include<string.h>
     3 #define max(a,b) a>b?a:b
     4 
     5 char a[1000],b[1000];
     6 int dp[1000][1000];
     7 
     8 int main(){
     9     while(scanf("%s%s",a,b)!=EOF){
    10         memset(dp,0,sizeof(dp));
    11 //        printf("%s
    %s
    ",a,b);
    12         int l1=strlen(a),l2=strlen(b),i,j;
    13         for(i=0;i<l1;i++){
    14             for(j=0;j<l2;j++){
    15                 if(a[i]==b[j]){
    16                     dp[i+1][j+1]=dp[i][j]+1;
    17                 }
    18                 else{
    19                     dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
    20                 }
    21             }
    22         }
    23 /*        for(i=0;i<=l1;i++){
    24             for(j=0;j<=l2;j++){
    25                 printf("dp[%d][%d]=%d
    ",i,j,dp[i][j]);
    26             }
    27         }*/
    28         printf("%d
    ",dp[l1][l2]);
    29     }
    30     return 0;
    31 }
    View Code

     

  • 相关阅读:
    浅拷贝和深拷贝问题
    指针遍历数组时用法
    一维数组和指针
    leetcode
    tmux
    git
    einsum详解
    spark快速大数据分析 读书笔记
    maven配置
    bash 学习笔记
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/4290211.html
Copyright © 2011-2022 走看看