这题和hdu 1423是一样的, 求最大上升公共子序列
设dp[i][j]为a序列前i个元素和b序列中前i个元素构成的以b[j]为结尾的最大上升公共子序列
if(a[i]!= b[j])
dp[i][j]= dp[i-1][j]
else if(a[i]== b[j])
dp[i][j]= max(dp[i-1][k]) + 1 (1<= k <=j && b[k]< b[j])
最大上升公共子序列详解:
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 1111
#define maxm 111111
int a[maxn], b[maxn], d[maxn];
int main()
{
// freopen("C:\\Users\\Monkey\\Desktop\\in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
int n, m;
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(d, 0, sizeof(d));
for(int i= 1; i<= n; i++)
{
int max= 0;
for(int j= 1; j<= m; j++)
{
if(a[i]> b[j] && d[j]> max)
max= d[j];
if(a[i]== b[j])
d[j]= max+ 1;
}
}
int ans= 0;
for(int i= 1; i<= m; i++)
if(d[i]> ans)
ans= d[i];
printf("%d\n",ans);
}
return 0;
}