zoukankan      html  css  js  c++  java
  • HDU1423最长上升公共子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1423

    一维数组.

     1 #include<stdio.h>
     2 #include<string.h>
     3 int a[510],b[510];
     4 int dp[510];
     5 int main()
     6 {
     7     int t,m,n,i,j;
     8     scanf("%d",&t);
     9     while(t--)
    10     {
    11         scanf("%d",&m);
    12         for(i=1;i<=m;i++)
    13             scanf("%d",&a[i]);
    14         scanf("%d",&n);
    15         for(i=1;i<=n;i++)
    16             scanf("%d",&b[i]);
    17         memset(dp,0,sizeof(dp));
    18         int ans=0,k;
    19         dp[0]=-1;
    20         for(i=1;i<=m;i++)
    21         {
    22             k=0;
    23             for(j=1;j<=n;j++)
    24             {
    25                 if(b[j]<a[i]&&dp[j]>dp[k])
    26                     k=j;
    27                 if(b[j]==a[i])
    28                     dp[j]=(dp[k]>=0?dp[k]:0)+1;
    29             }
    30         }
    31         for(i=0;i<=500;i++)
    32         {
    33             if(ans<dp[i])
    34                 ans=dp[i];
    35         }
    36         printf("%d
    ",ans);
    37         if(t) printf("
    ");
    38     }
    39     return 0;
    40 }
    View Code

     二维数组,dp[i][j]表示序列1的前i个元素和序列2的前j个序列。

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int N = 505;
     5 int num1[N],num2[N],f[N][N];
     6 int main()
     7 {
     8     int t,n,m;
     9     scanf("%d",&t);
    10     while(t--)
    11     {
    12         scanf("%d",&n);
    13         for(int i=1;i<=n;i++)scanf("%d",&num1[i]);
    14         scanf("%d",&m);
    15         for(int j=1;j<=m;j++)scanf("%d",&num2[j]);
    16         memset(f,0,sizeof(f));
    17         int answer=0;
    18         int ma;
    19         for(int i=1;i<=n;i++)
    20         {
    21             ma=0;
    22             for(int j=1;j<=m;j++)
    23             {
    24                 f[i][j]=f[i-1][j];
    25                 if(num1[i]>num2[j]&&f[i-1][j]>ma)ma=f[i-1][j];
    26                 if(num1[i]==num2[j])f[i][j]=ma+1;
    27             }
    28         }
    29         for(int j=0;j<=m;j++)answer=max(answer,f[n][j]);
    30         printf("%d
    ",answer);
    31         if(t!=0)printf("
    ");
    32     }
    33     return 0;
    34 }
    View Code
  • 相关阅读:
    Elasticsearch倒排索引结构
    Redis(二)冰叔带你了解Redis-哨兵模式和高可用集群解析
    jenkins构建配置
    jenkins配置email
    jenkins配置maven
    jenkins配置java
    jenkins配置git
    centos安装jenkins
    centos安装tomcat
    centos安装jdk
  • 原文地址:https://www.cnblogs.com/CrazyBaby/p/5692465.html
Copyright © 2011-2022 走看看