其他分享
首页 > 其他分享> > 4D - Mysterious Present 二维最长上升子序列

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

作者:互联网

原题链接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;
}

标签:pre,int,res,id,&&,Mysterious,4D,ep,Present
来源: https://www.cnblogs.com/luoyicong/p/14613509.html