最長不降低子序列

求最長不降低子序列的長度ios

第一行爲n,表示n個數 第二行n個數web

最長不降低子序列的長度數組

N小於5000spa


1. 比較粗暴的解法,依次檢查數字,用dfs檢查以它開始的,至數列結束的子序列的最長長度;時間複雜度在O(n*n*n); 提交上去超時了;code

2. 後來想了好久,意識到,不須要每次都計算序列的長度,用一個數組 ds[n], 保存該數字後面最長序列的長度,那麼dfs到該數字的時候,就能夠直接返回;這樣,每一個位置只須要計算一次,時間複雜度是O(N * N);ci

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_N = 5000;
//bool used[MAX_N];
int nums[MAX_N];
int ds[MAX_N];

int dfs(int n, int i) {
	if(i == n) {
		return 0;
	}
	if(ds[i] > 1) {
		return ds[i];
	}

	int res = 1;

	for(int j = i + 1; j < n; j++) {
		if(nums[j] >= nums[i]) {
			res = max(res, dfs(n, j) + 1);
		}
	}

	ds[i] = res;
	return res;
}

int main(void) {
	int n;
	cin >> n;
	memset(ds, 0, sizeof(ds));
	for (int i = 0; i < n; i++) {
		cin >> nums[i];
	}

	int res = 0;
	for (int i = 0; i < n; i++) {
		res = max(res, dfs(n, i));
	}

	cout << res;
	return 0;
}
相關文章
相關標籤/搜索