原题
题目大意:将小的信封放到大的信封中,如果宽度相同的话,矮的不能套到大的里面。
解题思路:是不是觉得有点像最长上升子序列的长度的那道题目?
这题是可以用dp来写的,我一开始就使用dp来写,但是发现我的复杂度太高了,因为我这一次的dp是用两层for循环来写的,所以我找到了这道题目的简化版–二分法!
于是还是先按照宽度从小到大的顺序排列,但是当高度相同的时候我们就要将长度高的放在前面,这里就是为了如果宽度相同的话,矮的不能套到大的里面这个限制条件的重复计算。
代码如下;
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<unordered_map>
#include<queue>
using namespace std;
struct node
{
int x;//width
int y;//length
};
bool cmp(node &a,node &b)
{
return a.x<b.x||(a.x==b.x&&a.y>b.y);
}
int main()
{
int n;
cin>>n;
vector<node>temp(n);
vector<int>dp;
vector<bool>visited;
for(int i=0;i!=n;++i)
{
cin>>temp[i].x>>temp[i].y;
}
sort(temp.begin(),temp.end(),cmp);
for(int i=0;i<n;++i)
{
int left=0;
int right=(int)dp.size();
int t=temp[i].y;
while(left<right)
{
int middle=left+(right-left)/2;
if(dp[middle]<t)
left=middle+1;
else
right=middle;
}
if(right>=dp.size())
dp.push_back(t);
else
dp[right]=t;
}
cout<<dp.size()<<endl;
}