最长公共子序列问题-HD1423

来源:互联网 发布:mp4网页播放器js代码 编辑:程序博客网 时间:2024/06/05 21:56

Greatest Common Increasing Subsequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6073    Accepted Submission(s): 1976


Problem Description
This is a problem from ZOJ 2432.To make it easyer,you just need output the length of the subsequence.
 

Input
Each sequence is described with M - its length (1 <= M <= 500) and M integer numbers Ai (-2^31 <= Ai < 2^31) - the sequence itself.
 

Output
output print L - the length of the greatest common increasing subsequence of both sequences.
 

Sample Input
151 4 2 5 -124-12 1 2 4
 

Sample Output

2

题目大意:求出两个数组公共的最长的上升子序列(可以不是连续的子序列)。

这是一道典型的求最长公共子序列问题。

#include <stdio.h>  #include <string.h>    #define MAX 501    int T;  int seq1[MAX], seq2[MAX];  int len1, len2;  int dp[MAX];    int LCIS(){      int i, j;      int Max;      memset(dp, 0, sizeof(dp)); //关键部分     for (i = 1; i <= len1; ++i){          Max = 0;          for (j = 1; j <= len2; ++j){              if (seq1[i] > seq2[j] && Max < dp[j])                  Max = dp[j];              if (seq1[i] == seq2[j])                  dp[j] = Max + 1;          }                  /*观察该数组值的变化 for (int I = 1; I <= len2; ++I)        printf("%d ",dp[I]);        printf("\n");*/    }      Max = 0;      for (i = 1; i <= len2; ++i){          if (Max < dp[i])              Max = dp[i];      }      return Max;  }    int main(){      int i;      scanf("%d", &T);      while (T-- != 0){          scanf("%d", &len1);          for (i = 1; i <= len1; ++i)              scanf("%d", &seq1[i]);          scanf("%d", &len2);          for (i = 1; i <= len2; ++i)              scanf("%d", &seq2[i]);          printf("%d\n", LCIS());          if (T)              putchar('\n');      }        return 0;  }  
本题dp数组值的变化情况:

1 0
原创粉丝点击