求最長不降低子序列的長度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; }