找到 最长递增子序列,并将其输出

最长递增子序列

给定数组arr,设长度为n,输出arr的最长递增子序列。(如果有多个答案,请输出其中字典序最小的)
输入描述
输出两行,第一行包括一个正整数n(n<=100000),代表数组长度。第二行包括n个整数,代表数组arr \left(1 \leq arr_i \leq 1e9 \right)(1arri1e9)。
输出描述
输出一行。代表你求出的最长的递增子序列。
示例1
输入
9 2 1 5 3 6 4 8 9 7
输出
1 3 4 8 9
示例2
输入
5
1 2 8 6 4
输出
1 2 4
说明:其最长递增子序列有3个,(1,2,8)、(1,2,6)、(1,2,4)其中第三个字典序最小,故答案为(1,2,4)
 
#include <iostream>
#include <vector>

using namespace std;

//判断两个数组那个字典序排列在前
bool dictOrder(vector<int> cur, vector<int> competitor){ for(int i = 0; i < competitor.size(); i++){ if(cur[i] <= competitor[i]){ continue; } else{ return false; } } return true; }
//动态规划,记录i每向前移一位时,搜索以input[i]结尾的最长递增子序列,并将这个子序列存储在“store”数组中。 vector
<int> fun(vector<int>& input){ vector<vector<int>> store(input.size()); store[0] = {input[0]}; for(int i = 1; i < input.size(); i++){ int longest = 0; for(int j = 0; j < i; j++){ if(*store[j].rbegin() < input[i]){ if(store[j].size() + 1 > longest){ store[i] = store[j]; store[i].emplace_back(input[i]); longest = store[j].size(); } else if(store[j].size() + 1 == longest){ if(dictOrder(store[i], store[j]) == false){ store[i] = store[j]; store[i].emplace_back(input[i]); longest = store[j].size(); } } } } if(store[i].size() == 0){ store[i].emplace_back(input[i]); } }
//找出所有以input[i]结尾的递增子序列中最长的 vector
<int> ans; for(auto &vec : store){ if(ans.size() < vec.size()){ ans = vec; } else if(ans.size() == vec.size() && vec.size() && ans.size()){ if(dictOrder(ans, vec) == false){ ans = vec; } } } return ans; } int main() { int n; cin >> n; vector<int> input(n); for(int i = 0; i < n; i++){ cin >> input[i]; } vector<int> ans = fun(input); for(int num : ans){ cout << num << ' '; } return 0; }

 

posted @ 2021-04-09 20:06  zeroPatrick  阅读(1001)  评论(0编辑  收藏  举报