2012年湖南省第八届程序设计大赛 J 病毒(最长上升公共子序列)

这题和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])

最大上升公共子序列详解:

http://wenku.baidu.com/link?url=3sU6f425-IEdqZz1aEcN5-J3EIzzRTprDT1glV_DkZMW6DmN60nLxfUl-WeeUEuxuY_M-WlNhJNabu8Dc_SeO_NZZVeGfkuX3hpZ-CrgM_S

 

代码:

#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;
}


 

你可能感兴趣的:(2012年湖南省第八届程序设计大赛 J 病毒(最长上升公共子序列))