Greatest Common Increasing Subsequence
模板解析:https://blog.youkuaiyun.com/qq_34374664/article/details/77659413
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
题解:给定两个数字串s1、s2,求出它们最长公共递增子序列的长度(可以不是连续的子序列)
代码:
#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
int s1[510], s2[510];
int l1, l2;
int dp[510];
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int i,j;
scanf("%d", &l1);
for (i = 1; i <= l1; ++i)
scanf("%d", &s1[i]);
scanf("%d", &l2);
for (i = 1; i <= l2; ++i)
scanf("%d", &s2[i]);
memset(dp, 0, sizeof(dp));
int maxx;
for (i = 1; i <= l1; i++)
{
maxx= 0;
for (j = 1; j <= l2; j++)
{
if (s1[i] > s2[j] && maxx< dp[j]) //判断是否为增序,更新最大值
maxx= dp[j];
if (s1[i] == s2[j]) //记录增序终止时,增序的长度
dp[j] = maxx+ 1;
}
}
maxx = 0;
for (i = 1; i <= l2; i++)
if (maxx< dp[i])
maxx = dp[i];
printf("%d\n",maxx);
if (t)
printf("\n");
}
}