C++最長上昇サブシーケンス


ダイナミックプランニングに基づく考え方
#include
#include
#include
#include
#include
#include
using namespace std;

int main() {
	int arr[] = { 2,1,4,3,1,5,6};
	int len[8];  //       , arr[i]      ,         
	int max_val = 1;
	for (int i = 0; i < 8; i++) {
		len[i] = 1;//          ,                
		for (int j = 0; j < i; ++j) {  
			if (arr[j] < arr[i] && len[i] < len[j]+1)//                     
				len[i] = len[j] + 1;
		}
		max_val = max(max_val, len[i]);
	}
	cout<< max_val;

	return 0;
}

欲張り+二分検索に基づく
#include
#include
#include
#include
#include
#include
using namespace std;

int main() {
	vector arr{ 2,1,4,3,1,4,5,6 };
	vector len;  //       
	len.push_back(arr[0]);
	for (int i = 1; i < 8; ++i) {
		if (arr[i] > len.back())
			len.push_back(arr[i]);
		else if (arr[i] < len.back()) {
			int low = 0, high = len.size()-1;
			while (low <= high) {
				int mid = (low + high) / 2;
				if (len[mid] < arr[i]) {//          a[i]  
					low = mid + 1;
				}
				else if (len[mid] >= arr[i]) {
					high = mid - 1;
				}
			}
			len[low] = arr[i];
		}
	}
	for (auto temp : len)
		cout << temp << " ";
	return 0;
}
#include
#include
#include
#include
#include
#include
using namespace std;

int main() {
	vector A{ 2,1,4,3,1,4,5,6 };
	vector len;  //       
	len.push_back(A[0]);
	for (int i = 1; i < 8; ++i) {
		if (A[i] > len.back())
			len.push_back(A[i]);
		else if (A[i] < len.back()) {
			auto it = lower_bound(len.begin(), len.end(), A[i]);//          ,     >=A[i]   
			if (it != len.end())
				*it = A[i];				
		}
	}
	for (auto temp : len)
		cout << temp << " ";
}

非厳密増分サブシーケンス
#include
#include
#include
#include
#include
#include
using namespace std;

int main() {
	vector A{ 2,1,4,3,1,4,5,6 };
	vector len;  //       
	len.push_back(A[0]);
	for (int i = 1; i < 8; ++i) {
		if (A[i] > len.back())
			len.push_back(A[i]);
		else if (A[i] < len.back()) {
			auto it = upper_bound(len.begin(), len.end(), A[i]);//        ,     >A[i]  
			if (it != len.end())
				*it = A[i];				
		}
	}
	for (auto temp : len)
		cout << temp << " ";
}