信封嵌套笔记
- 题目要求当一个信封的长和宽都大于另外一个信封时,另外一个信封可以装在此信封里面。给了n个信封的长和宽,求出最多能嵌套多少层信封。
- 首先对这些信封按长递增和宽递增的顺序进行排序,然后使用动态规划,dp[i]表示以信封i为结尾能嵌套的最大层数。然后就是使用最长递增子序列的思想来解题,但是此算法实景复杂度为n^2,在牛客上能过,在力扣上直接超时,貌似还有一种二分查找的方法,难得想了。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(vector<int> & nums1,vector<int>& nums2){
if(nums1[0]==nums2[0]){
return nums1[1]<nums2[1];
}
else{
return nums1[0]<nums2[0];
}
}
int main(){
int n;
cin>>n;
vector<vector<int>> nums(n,vector<int>(2,0));
for(int i=0;i<n;i++){
cin>>nums[i][0];
cin>>nums[i][1];
}
sort(nums.begin(),nums.end(),cmp);
vector<int> dp(n,1);
int result=1;
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(nums[i][0]>nums[j][0] && nums[i][1] > nums[j][1]){
dp[i]=max(dp[i],dp[j]+1);
}
}
result=max(result,dp[i]);
}
cout<<result<<endl;
return 0;
}