UVA - 10635 - Prince and Princess (LCS转化为LIS)

题目传送:UVA - 10635

思路:直接思路是两个串的LCS,不过这个题可以转化为LIS,因为说了序列中各个元素互不相同,所以可以来个映射算出第二个字符串中的字符对应第一个字符串中字符的位置(不存在即删去),然后算出这些位置的LIS即可

AC代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;

const int maxn = 250 * 250 + 10;

int S[maxn], g[maxn];
int num[maxn];//记录第一个数组中每个数字出现的位置
int N, p, q;

int main() {
	int T;
	int cas = 1;
	scanf("%d", &T);
	while(T --) {
		scanf("%d %d %d", &N, &p, &q);
		memset(num, 0, sizeof(num));
		for(int i = 1; i <= p + 1; i ++) {
			int t;
			scanf("%d", &t);
			num[t] = i;
		}
		int n = 0;
		for(int i = 1; i <= q + 1; i ++) {
			int t;
			scanf("%d", &t);
			if(num[t] != 0) {
				S[n ++] = num[t];
			}
		}

		//n*logn求S数组的LIS
		for(int i = 1; i <= n; i ++) g[i] = INF;
		int ans = 0;
		for(int i = 0; i < n; i ++) {
			int pos = lower_bound(g + 1, g + n + 1, S[i]) - g;//n*logn查找
			g[pos] = S[i];
			ans = max(ans, pos);
		}
		printf("Case %d: %d\n", cas ++, ans);
	}
	return 0;
}
时间: 2024-10-08 14:10:52

UVA - 10635 - Prince and Princess (LCS转化为LIS)的相关文章

uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))

题目大意:有两个长度分别为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n^2之间的整数.两个序列的第一个元素均为1.求出A和B的最长公共子序列长度. 分析:本题是LCS问题,但是p*q<=62500,O(pq)的算法显然会LE.在这里有一个条件,每个序列中的各个元素互不相同,所以可以把A中元素重新编号为1~p+1.例如,样例中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就是{1,4,6,3,0

uva 10635 Prince and Princess(DP)

uva 10635 Prince and Princess(DP) In an n x n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbered 1, 2, 3 ... n*n, as shown below: Prince stands in square 1, make p jumps and finally reach square n*n. He enters a

算法竞赛与入门经典---P66 [UVA 10635] Prince and Princess

Prince and PrincessInput: Standard Input Output: Standard Output Time Limit: 3 Seconds In an n x n chessboard, Prince and Princess plays a game. The squares in the chessboard are numbered 1, 2, 3 ... n*n, as shown below: Prince stands in square 1, ma

UVa 10635 - Prince and Princess

题目:在一个n*n的棋盘上,格子标号1~n*n,现在有两个人从1跳到n*n(不走重复点), 现在要求去掉最少的中间点,使得路径是一样的. 分析:dp,LIS,LCS.问题是求最大公共子序列,数据较大需要O(nlgn)算法. 发现题目中的数据是不重复的,所以可以转化成最大上升子序列: 记录序列1中每个元素对应的顺序,将序列2中的元素转化成对应序列1中的顺序标号: 那么,新构成的序列2中递增的序列即为序列1中的先后顺序,所以求出它的LIS即可. 说明:╮(╯▽╰)╭. #include <algor

UVA - 10635 —— Prince and Princess

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19051 首先,这题一看就知道是——最长公共子序列(LCS) 但是,会发现这道题的字符串长度可能达到62500,我们现在会的LCS的解法时间复杂度为O(n^2),所以是会超时的. 那么,这时候就要想:题目有没有给出更多的条件给我们,让我们能够在更快地时间内完成任务呢? 还真有!题目有一个反复强调的条件,就是:一个字符串的全部字符都是不同的! 所以,我们可以这样: (1)

UVA 10635 Prince and Princess 最长公共子序列(nlongn)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19051 题目意思是给你两串数字(计为 a,b 数组),让你求他们的最长公共子序列.数字长度是 n * n (n <= 250)所以 O(n^2) 肯定过不了了.所以想要找 O(nlongn)的. 因为题目给出了数字在 1 ~ (n^2)内并且数字不会重复.因此,对于a数组中的每个数字,如果我们都知道他在b数组中出先得位置的话(位置计为 c 数组),我们只需要在c数组里面求一

uva10635 Prince and Princess LCS 变 lIS

// uva10635 Prince and Princess LCS 变 lIS // 本意求LCS,但是规模有60000多,复杂度肯定不够 // 注意如果俩个序列的值的范围相同,那么可以在一个 // 串中记录在另外一个串中的位置.这样就可以转化成 // 最长上升子序列的问题啦,复杂度是nlogn,可以ac // 这题,还是挺有考究的价值的,很不错 // 哎,继续练吧..... #include <algorithm> #include <bitset> #include <

10635 - Prince and Princess

/*题意:T组测试,输入n,p,q ,接下来两行,第一行 p +1 个数,第二行 q + 1个数,这些数都在 N*N范围内 .找出最长公共子序列. 因为 p,q范围较大,如果用 p*q 的做法会超时,看了题解后知道了可以转成 LIS 来求,LIS 只要 NlonN 就可以辣. */ LCS转LIS,这里摘抄一段,原文出自 “[email protected]” 博客, http://karsbin.blog.51cto.com/1156716/966387 举例说明:A:abdbaB:dbaab

uva10635 王子和公主(把lcs转化为lis)

有两个长度为p+1和q+1的序列,每个序列中的各个元素互不相同,且都是1~n*n之间的整数,两个序列的第一个元素都是1,求a和b的最长公共子序列的长度. 思路很容易想到lcs,但是由于O(pq)的算法肯定会超时,所以不能采用,注意到a和b中的元素互不相同,故可以预处理a中的元素,用trans数组记录a每个元素值对应的位置,然后处理b中的元素,把每个元素转化成该元素在a中的位置,如果没在a中出现那么为零,这样就把lcs问题转化成了lis #include<cstdio> #include<