hdu 1423 Greatest Common Increase Subsequence(最長上昇共通サブシーケンス)
1585 ワード
http://acm.hdu.edu.cn/showproblem.php?pid=1423
はい、この問題に対しては言葉がないという意味です.
二つの数字の系列をあげて、一番長いのは公共のサブシーケンスの長さを上げることを求めます.したがって、最初の共通サブシーケンスは、最初のシーケンスiが対応するまでの最長の共通サブシーケンスの長さを配列でマークし、最長の上昇サブシーケンスを求めることができます.
はい、この問題に対しては言葉がないという意味です.
二つの数字の系列をあげて、一番長いのは公共のサブシーケンスの長さを上げることを求めます.したがって、最初の共通サブシーケンスは、最初のシーケンスiが対応するまでの最長の共通サブシーケンスの長さを配列でマークし、最長の上昇サブシーケンスを求めることができます.
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int test;
int n,m;
int a[510],b[510],c[510],d[510];
int dp[510][510];
scanf("%d",&test);
for(int item = 1; item <= test; item++)
{
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i = 1; i <= m; i++)
scanf("%d",&b[i]);
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++)
{
c[i] = -1;//c[i] i
for(int j = 1; j <= m; j++)
{
if(a[i] == b[j])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
c[i] = max(c[i],dp[i][j]);
}
}
int maxn = -1,pos = 1;
for(int i = 1; i <= n; i++)
{
d[i] = 1;//d[i] i
for(int j = 1; j < i; j++)
{
if(a[j] < a[i] && d[i] < d[j]+1)
d[i] = d[j]+1;
}
if(maxn < d[i])
{
maxn = d[i];
pos = i;
}
}
//
printf("%d
",c[pos]);
if(item < test) printf("
");// , PE.
}
return 0;
}