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

4D - Mysterious Present 二维最长上升子序列

时间:2021-04-05 12:33:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:res   意义   set   psc   条件   const   链接   编号   com   

原题链接https://codeforces.com/problemset/problem/4/D

题意:给你n个二元组和起始条件,求其最大二维上升子序列,并输出选择编号。

思路:按照一个维度排序,然后DP即可,注意细节。

代码如下

int n, w, h;
struct node{
	int w, h, id;
	bool operator < (const node &t) const
	{
		return w < t.w;
	}
}ep[N];
int f[N], pre[N];

int main()
{
	IOS;
	cin >> n >> w >> h;
	for(int i = 1 ; i <= n ; i ++)
	{
		cin >> ep[i].w >> ep[i].h;
		ep[i].id = i;
	}
	sort(ep + 1, ep + n + 1);
	for(int i = 1 ; i <= n ; i ++)
	{
		if(ep[i].w > w && ep[i].h > h)	//只有能放卡才有意义 
		{
			f[i] = 1;
			pre[i] = i;
			for(int j = 1 ; j < i ; j ++)
			{
				if(ep[i].w > ep[j].w && ep[i].h > ep[j].h && f[i] < f[j] + 1)
					f[i] = f[j] + 1, pre[i] = j;
			}
		}
	}
	
	int res = 0, d = 0;
	for(int i = 1 ; i <= n ; i ++)
		if(res < f[i])
			res = f[i], d = i;
	
	cout << res << endl;
	if(res)
	{
		vector<int> v;
		int t = pre[d];
		v.push_back(ep[d].id);
		res --;
		while(res --)
		{
			v.push_back(ep[t].id);
			t = pre[t];
		}
		for(int i = v.size() - 1 ; i >= 0 ; i --)
			cout  << v[i] << " ";
	}
	
	return 0;
}

4D - Mysterious Present 二维最长上升子序列

标签:res   意义   set   psc   条件   const   链接   编号   com   

原文地址:https://www.cnblogs.com/luoyicong/p/14613509.html

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