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

    最长公共子序列

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
    tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
     
    输入
    第一行给出一个整数N(0<N<100)表示待测数据组数
    接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
    输出
    每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
    样例输入
    2
    asdf
    adfsd
    123abc
    abc123abc
    样例输出
    3
    6
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 using namespace std;
     5 
     6 char str[1005];
     7 char stest[1005];
     8 int dp[1005][1005];
     9 
    10 int main(int argc, char const *argv[])
    11 {
    12     int n;
    13     scanf("%d",&n);
    14     while(n--) {
    15         scanf("%s",str);
    16         scanf("%s",stest);
    17         memset(dp, 0, sizeof(dp));
    18         int slen = strlen(str);
    19         int tlen = strlen(stest);
    20         for(int i = 0; i < slen; i++) {
    21             for(int j = 0; j < tlen; j++) {
    22                 if(str[i] == stest[j]) {
    23                     dp[i+1][j+1] = dp[i][j]+1;
    24                 }
    25                 else {
    26                     dp[i+1][j+1] = max(dp[i+1][j],dp[i][j+1]);
    27                 }
    28             }
    29         }
    30         printf("%d
    ",dp[slen][tlen]);
    31     }
    32     return 0;    
    33 }

    动态规划经典题目。

    dp[i][j]表示当母串下标为i,子串下标为j时的最长公共子序列长度

  • 相关阅读:
    SQL Server 2005 Beta 2 快照隔离 zt
    WP7基础学习第九讲
    WP7基础学习第七讲
    WP7基础学习第二讲
    如何对HttpWebRequest异步调用?
    WP7基础学习第五讲
    如何对HttpWebRequest和HttpWebRsponse异步调用?
    WP7基础学习第六讲
    WP7基础学习第一讲
    [收藏学习]gcc和g++
  • 原文地址:https://www.cnblogs.com/jasonJie/p/6093361.html
Copyright © 2011-2022 走看看