最长递增子序列(一维二维)

Posted 松狮MVP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长递增子序列(一维二维)相关的知识,希望对你有一定的参考价值。

1、一维:


void main01()

	vector<int> data =  2, 1, 6, 4, 5, 2, 7, 4;
	vector<int> len(data.size(), 1);     //记录长度的辅助数组

	int maxx = len[0];

	for (int i = 1; i < data.size(); i++)
	
		int cur = 0;
		for (int j = 0; j < i; j++)
		
			if (data[j] < data[i]  && cur < len[j])
			
				cur = len[j];      //选出比当前元素小的中的len的最大值
			
		
		len[i] = cur + 1;    //当前元素的len值是前面比它小的并且在小的中的最大值加1(把当前元素加到序列中)

		maxx = max(maxx, len[i]);    //每一步直接选出当前最大值
	

	cout << maxx << endl;



2、二维:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;


bool comp(pair<int, int> a, pair<int, int> b)   //自定义比较器

	if (a.first == b.first)
		return a.second<b.second; 
	return a.first<b.first;
;

int maxEnvelopes(vector<pair<int, int>>& envelopes) 

	sort(envelopes.begin(), envelopes.end(), comp);    // 排序

	vector<int> len(envelopes.size(), 1);   //初始化
	int maxx = 0;
	if (envelopes.size()>0)
		maxx = 1;

	for (int i = 1; i<envelopes.size(); i++)
	
		int cur = 0;
		for (int j = 0; j<i; j++)
		
			if (envelopes[i].first > envelopes[j].first && envelopes[i].second > envelopes[j].second && cur < len[j]) 
			
				cur = len[j];
			
		
		len[i] = cur + 1;
		maxx = max(maxx, len[i]);
	

	return maxx;



void main()

	int first, second;
	vector<pair<int, int> > data;
	while (cin >> first >> second)     //回车+ctrl+Z结束输入
	
		data.push_back(pair<int, int>(first, second));
	

	cout << maxEnvelopes(data) << endl;


以上是关于最长递增子序列(一维二维)的主要内容,如果未能解决你的问题,请参考以下文章

leetcode最长递增子序列问题

动态规划-最长递增子序列

LeetCode刷题 最长递增子序列

笔试题1:最长严格递增子序列

最长递增子序列 && 最大子序列最长递增子序列最长公共子串最长公共子序列字符串编辑距离

最长递增子序列