UVA 10635 - Prince and Princess (LCS转成LIS DP)

14 篇文章 0 订阅
12 篇文章 0 订阅

这题因为长度为n*n,n最大为250,所以会O(N^2)的LCS(最长公共子序列)算法会超时。所采用的方法是将LCS问题转成LIS(最长递增子序列),不过有个前提,是集合里的数字要没有重复的,这题符合这个要求,比如两个集合A与B,A={1,7,5,4,8,3,9},B={1,4,3,5,6,2,8,9},对A里的数字进行编号,变成了{1,2,3,4,5,6,7},然后B也对应的变成了B={1,4,6,3,0,0,5,7},0可以不要,因为0代表在A中没出现过,不可能在最长公共子序列里的,所以只留下了{1,4,6,3,5,7},就变成了找最长递增子序列的问题了,然后LIS算法有两种,一种是O(n^2)的,还有一种是O(nlogn)的,用nlogn的算法,可以过

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN=251*252;
int main(int argc,char* argv[]){
	int i,j;
	int num[MAXN];
	int sss[MAXN];
	int d[MAXN];
	int T;
	scanf("%d",&T);
	int kase=0;
	while(T--){
		kase++;
		memset(num,0,sizeof(num));
		int n,p,q;
		scanf("%d %d %d",&n,&p,&q);
		int temp;
		for(i=1;i<=p+1;i++){
			scanf("%d",&temp);
			num[temp]=i;
		}
		int k=0;
		for(i=1;i<=q+1;i++){
			scanf("%d",&temp);
			if(num[temp]){
				sss[k++]=num[temp];	
			}
		}
		d[1]=sss[0];
		int len=1;
		for(i=1;i<k;i++){
			 int m=lower_bound(d+1,d+len,sss[i])-d;
			 d[m]=sss[i];
			 if(m==len)
			 	len++;
		}
		printf("Case %d: %d\n",kase,len);
	}
	return 0;
}

/*
5
5 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
Case 1: 1

*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值