zoukankan      html  css  js  c++  java
  • NYOJ 36 最长公共子序列

    http://acm.nyist.net/JudgeOnline/problem.php?pid=36

    今天突然想到那天文哥给我看的最长公共子序列的问题....然后自己找了这道题来看看..
    那天文哥叫我看的时候, 自己就这么一下扫过去.   没什么概念.

    今天自己从头按照它的分析方法来分析了下. 

    f[i][j] 表示 s1 的 i 个字符和 s2 的 j 个字符内最长的公共子序列

    if(s1[i] == s2[j])   f[i][j] = f[i-1][j-1] + 1;

    else f[i][j] = max(f[i-1][j], f[i][j-1]);

    当不相同的时候,则考虑在 s1 的 i 个字符和 s2 的 j 个字符内最长的公共子序列.

    可用  s1 的 i -1 个字符和 s2 的 j 个字符内最长的公共子序列长度 和 s1 的 i 个字符和 s2 的 j -1 个字符内最长的公共子序列长度的最大值.

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #define maxn 1001
     4 char s1[maxn], s2[maxn];
     5 int ans[maxn][maxn];
     6 int max(int a, int b)
     7 {
     8     return a > b ? a : b;
     9 }
    10 int main()
    11 {
    12     int i, j, t, len1, len2, mark;
    13     scanf("%d",&t);
    14     while(t--)
    15     {
    16         scanf("%s%s",s1,s2);
    17         len1 = strlen(s1);
    18         len2 = strlen(s2);
    19         for(i = 0; i <= len1; i++)
    20         for(j = 0; j <= len2; j++)
    21         ans[i][j] = 0;
    22         mark = 0;
    23         for(i = 1; i <= len1; i++)
    24         {
    25             for(j = 1; j <= len2; j++)
    26             {
    27                 if(s1[i-1]==s2[j-1])
    28                 {
    29                     ans[i][j] = ans[i-1][j-1]+1;
    30                 }
    31                 else
    32                    ans[i][j] = max(ans[i-1][j], ans[i][j-1]);
    33                 if(mark < ans[i][j])  mark = ans[i][j];   
    34             }
    35         }
    36         printf("%d\n",mark);
    37     }
    38     return 0;
    39 }

      

  • 相关阅读:
    angular简介和其特点介绍
    angular简介和其特点介绍(上)
    javascript基础部分三大核心是什么意思 ?
    Javascript介绍
    CSS 基础知识(下)
    CSS 基础知识(中)
    echarts饼图样式
    es6箭头函数
    微信小程序中的app文件介绍
    关于vue-cli中-webkit-flex-direction: column失效问题
  • 原文地址:https://www.cnblogs.com/yoru/p/2670555.html
Copyright © 2011-2022 走看看