HDOJ 1423 Greatest Common Increasing Subsequence -- 动态规划
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1423
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
1
5
1 4 2 5 -12
4
-12 1 2 4
Sample Output
2
题目大意是给定两个数字串seq1、seq2,求出它们最长公共递增子序列的长度。
状态dp[j]表示seq1中从1到n与seq2中从1到j并以seq2[j]为结尾的最长公共上升子序列的长度。
状态转移方程:dp[j] = dp[k] + 1, if seq1[i] = seq2[j], 1 <= k < j.
状态dp[j]表示seq1中从1到n与seq2中从1到j并以seq2[j]为结尾的最长公共上升子序列的长度。
状态转移方程:dp[j] = dp[k] + 1, if seq1[i] = seq2[j], 1 <= k < j.
#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; } } Max = 0; for (i = 1; i <= len2; ++i){ if (Max < dp[i]) Max = dp[i]; } return Max; } int main(void){ 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 ", LCIS()); if (T) putchar(' '); } return 0; }