码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划 最长公共子序列 王子和公主 Prince and Princess UVa 10635

时间:2015-02-09 00:51:08      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:动态规划   uva   算法   algorithm   acm   

技术分享

#include <iostream>
#include <algorithm>

using namespace std;

const int maxn = 250 * 250;

int main(){
	char T;
	cin >> T;
	for (char k = 0; k < T;k++)
	{
		int n, p, q;
		cin >> n >> p >> q;
		int num[maxn];
		memset(num, 0, sizeof(num));
		int temp;
		for (int i = 0; i < p; i++){
			cin >> temp;
			num[temp] = i; 
		}
		int S[maxn];
		int size = 0;
		for (int i = 0; i < q; i++) {
			cin >> temp;
			if (num[temp]){
				S[size++] = num[temp];
			}
		}
//降低复杂度, 由于这些数字并不重复,  所以可以将他们映射到1-n
//这样,  公共子序列问题就转化为 公共递增子序列问题
//下面是LIS算法
                int stack[maxn];
		for (int i = 0; i < maxn; i++) stack[i] = maxn;
		int ans = 1;
		for (int i = 0; i < maxn; i++){
			int count = lower_bound(stack + 1, stack + n + 1, S[i]) - stack;
			if (count>ans) ans = count;
			stack[count] = S[i];
		}
		cout << "Case " << k <<": "<< ans<<endl;
	}
}


动态规划 最长公共子序列 王子和公主 Prince and Princess UVa 10635

标签:动态规划   uva   算法   algorithm   acm   

原文地址:http://blog.csdn.net/qq_21970857/article/details/43650355

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!