zoukankan      html  css  js  c++  java
  • BNUOJ 4215 最长公共连续子序列

    最长公共连续子序列

    1000ms
    65536KB
     
    64-bit integer IO format: %lld      Java class name: Main
     

     给你两个序列S1和S2,长度分别是L1,L2 (1 <= L1 , L2 <= 180). 

     
    写一个程序找出最长的连续公共子序列。
     
    连续子序列定义为序列中连续的一个片段。例如序列"1 2 3"的子串有空串,"1","2","3","1 2","2 3","1 2 3"。
     

    Input

    第1行:两个整数L1,L2,以一个空格隔开。

    第2行到第L1+1行:每行一个整数,第i+1行给出S1中的第i个数。
    第L1+2行到第L1+L2+1行:每行一个整数,第L1+i+1行给出S1中的第i个数。
     

    Output

     一个整数,给出S1和S2的最长连续子序列的长度

     

    Sample Input

    10 12
    1
    1
    1
    3
    2
    3
    3
    3
    4
    5
    1
    1
    1
    1
    3
    2
    3
    3
    4
    4
    5
    -8
     

    Sample Output

    7
     

    Source

     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <climits>
     7 #include <algorithm>
     8 #include <cmath>
     9 #define LL long long
    10 using namespace std;
    11 int a[200],b[200],dp[200][200];
    12 int main(){
    13     int n,m,i,j,ans;
    14     while(~scanf("%d %d",&n,&m)){
    15        for(i = 1; i <= n; i++)
    16             scanf("%d",a+i);
    17         for(j = 1; j <= m; j++)
    18             scanf("%d",b+j);
    19         memset(dp,0,sizeof(dp));
    20         for(ans = 0,i = 1; i <= n; i++){
    21             for(j = 1; j <= m; j++){
    22                 if(a[i] == b[j]){
    23                     dp[i][j] = dp[i-1][j-1]+1;
    24                 }
    25                 if(dp[i][j] > ans) ans = dp[i][j];
    26             }
    27         }
    28         printf("%d
    ",ans);
    29     }
    30     return 0;
    31 }
    View Code
  • 相关阅读:
    384. 最长无重复字符的子串
    406. 和大于S的最小子数组
    159. 寻找旋转排序数组中的最小值
    62. 搜索旋转排序数组
    20. 骰子求和
    125. 背包问题 II
    92. 背包问题
    1295. 质因数统计
    471. 最高频的K个单词
    1339. 最大区间
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3835730.html
Copyright © 2011-2022 走看看