例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6.
第一行包含一个整数T,代表测试数据组数。
对于每组测试数据:
N-数组的长度
a1 a2 ... an (需要计算的数组)
保证:
1<=N<=3000,0<=ai<=MAX_INT.
对于每组数据,输出一个整数序列,代表最长递增子序列。
若有多组最长上升子序列,输出第一组。
保证:1<=T<=20,1<=N<=3000,0<=ai<=MAX_INT.
2 7 89 256 78 1 46 78 8 5 6 4 8 2 17
1 46 78 6 8 17
#include<iostream> #include<vector> using namespace std; intmain(){ intn; while(cin>>n){ for(intm=0;m<n;m++){ intsize,max=0,lastpos; cin>>size; vector<int>array(size); for(intj=0;j<size;j++){ cin>>array[j]; } vector<int> dp(size); vector<int> pos(size); for(inti=0;i<size;i++){ dp[i]=1; for(intj=0;j<i;j++){ if(array[i]>array[j]){ if(dp[j]+1>dp[i]){ dp[i]=dp[j]+1; pos[i]=j; } if(max<dp[i]){ max=dp[i]; lastpos=i; } } } } vector<int>ans; for(inti=0;i<max;i++){ ans.push_back(array[lastpos]); lastpos=pos[lastpos]; } for(inti=max-1;i>=1;i--) cout<<ans[i]<<' '; cout<<ans[0]<<endl; } } return0; }
#include <iostream> #include <string.h> using namespace std; struct saveT{ int longest; //储存以这个数为尾的最长子序列的长度 int last_point;//上一个点 }; int main(){ int t,n,array[3005],max_num,last_item,answer[3005]; saveT save[3005]; memset(save,0,sizeof(save)); cin>>t; for(int i=0;i<t;i++){ max_num = last_item = 0; cin>>n; for(int j=0;j<n;j++){ cin>>array[j]; } for(int j=0;j<n;j++){ save[j].longest = 1; save[j].last_point = j; for(int k=0;k<j;k++){ if(array[j]>array[k]){ //找这个元素之前的,如果自己比他大 if(save[k].longest+1>save[j].longest){//并且他的最长子序列加1 比自己长 save[j].longest = save[k].longest+1; save[j].last_point = k; if(max_num<save[j].longest){ max_num = save[j].longest; last_item = j; } } } } } for(int j=0;j<max_num;j++){ answer[j] = last_item; last_item = save[last_item].last_point; } for(int j=max_num-1;j>0;j--){ cout<<array[answer[j]]<<" "; } cout<<array[answer[0]]<<endl; } }
#include <iostream>#include <vector>usingnamespacestd;intmain(){intT;while(cin>>T){for(inti=0; i<T; i++){intN;cin>>N;intarr[N],dp[N];vector<vector<int> > vi(N);for(intj=0; j<N; j++){cin>>arr[j];dp[j]=1;vi[j].push_back(arr[j]);}intidx=0;for(intk=1; k<N; k++){inttemp=k;for(inth=0; h<k; h++){if(arr[h]<arr[k]){if(dp[h]+1>dp[k]){dp[k]=dp[h]+1;temp=h;}}}if(temp<k)vi[k].insert(vi[k].begin(),vi[temp].begin(),vi[temp].end());if(vi[k].size()>vi[idx].size()){idx=k;}}for(ints=0; s<vi[idx].size()-1; s++)cout << vi[idx][s] << " ";cout << vi[idx][vi[idx].size()-1] << endl;}}return0;}
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <set> using namespace std; vector<int> findLongestArr(vector<int> A, int n) { // write code here vector<int> ans; if (!n) return ans; vector<int> dp(n, 1); multiset<int> help; help.insert(A[0]); for (int i = 1; i < n; i++) { multiset<int>::iterator itor = help.lower_bound(A[i]); if (itor != help.end()) { help.erase(itor); help.insert(A[i]); int num = 1; multiset<int>::iterator iter = help.begin(); for (; iter != help.end(); iter++) { if (*iter == A[i]) break; num++; } dp[i] = num; } else { help.insert(A[i]); dp[i] = help.size(); } } int length = dp[0]; int beg = 0; for (int i = 1; i < n; i++) { if (length < dp[i]) { length = dp[i]; beg = i; } } ans.insert(ans.begin(), A[beg]); length = length - 1; while (length--) { int i = 0; while (i < beg) { if (dp[i] == dp[beg] - 1 && A[i] < A[beg]) { ans.insert(ans.begin(), A[i]); beg = i; break; } i++; } } return ans; } int main() { using namespace std; int t; cin >> t; while (t--) { int n; cin >> n; vector<int> height(n); for (int i = 0; i < n; i++) { cin >> height[i]; } vector<int> ans; ans = findLongestArr(height, n); for (int i = 0; i < ans.size() - 1; i++) { cout << ans[i] << " "; } cout << ans[ans.size() - 1] << endl; } return 0; }
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> dp(vector<int> seq){ int max = 0; int maxpos = -1; int size = seq.size(); vector<int> rec(size, 1); vector<int> from(size, -1); for (int i = 0; i < size; i++){ for (int j = 0; j < i; j++){ if (seq[i] > seq[j] && rec[j] + 1 > rec[i]){ rec[i] = rec[j] + 1; from[i] = j; if (rec[i] > max){ maxpos = i; max = rec[i]; } } } } vector<int> ret; int curr = maxpos; while (curr >= 0){ ret.push_back(seq[curr]); curr = from[curr]; } reverse(ret.begin(),ret.end()); return ret; } int main(){ int sets; cin >> sets; for (int i = 0; i < sets; i++){ int nums; cin >> nums; vector<int> raw(nums); for (int j = 0; j < nums; j++){ cin >> raw[j]; } vector<int> result = dp(raw); for (int j = 0; j < result.size() - 1; j++){ cout << result[j] << " "; } cout << result[result.size() - 1] << endl; } return 0; }
import java.util.Scanner; import java.util.List; import java.util.ArrayList; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { int size = in.nextInt(); for (int i = 0; i < size; i++) { int len = in.nextInt(); int[] data = new int[len]; for (int j = 0; j < len; j++) { data[j] = in.nextInt(); } getMaxIncrementSequence(data, len); } } in.close(); } public static void getMaxIncrementSequence(int[] data, int len) { int[] dp = new int[len]; dp[0] = 1; int max = 1; List<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); int index = -1, k = 0; ArrayList<Integer> tem = new ArrayList<Integer>(); tem.add(data[0]); res.add(tem); for (int i = 1; i < len; i++) { index = -1; tem = new ArrayList<Integer>(); for (int j = 0; j < i; j++) { if (data[i] > data[j] && dp[j] > dp[i]) { dp[i] = dp[j]; index = j; } } ++dp[i]; if (index > -1) { tem.addAll(res.get(index)); } tem.add(data[i]); res.add(tem); if (dp[i] > max) { max = dp[i]; k = i; } } tem = res.get(k); StringBuilder sb = new StringBuilder(); for (int i = 0; i < tem.size() - 1; i++) { sb.append(tem.get(i)); sb.append(" "); } sb.append(tem.get(tem.size() - 1)); System.out.println(sb.toString()); } }
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.util.Vector;
//求一列数中最长的等差数列,如3,4,5,8,9,10,2,则输出4.
public class Longseq {
public static int maxNumseq(Integer[] data)
{
int max=2,maxindex=0,maxstep;
Arrays.sort(data);
int findex,step,count;
for(int i=0;i<data.length-2;i++)
{
findex=i+1;
step=data[i+1]-data[i];
count=2;
for(int j=i+2;j<data.length;j++)
{
if(data[j]==data[findex] +step)
{
count++;
findex=j;
}
}
if(count>max)
{
max=count;
maxindex=i;
maxstep=step;
}
}
return max;
}
public static
void main(String s[])
{
int a,b;
Scanner sc=new
Scanner(System.in);
Vector<Integer> v=new Vector();
int num=sc.nextInt();
while(num>0)
{
v.add(sc.nextInt());
num--;
}
System.out.println( maxNumseq( v.toArray(new Integer[0])) );
}
}
#include <iostream> #include <vector> #include <set> using namespace std; int main(){ int T; cin >> T; while(T--){ int n; cin >> n; vector<int> nums(n, 0); for(int i=0;i<n;i++){ cin >> nums[i]; } vector<int> keep; vector<set<int>> pos; for(int i=0;i<n;i++){ auto it = lower_bound(keep.begin(), keep.end(), nums[i]); if(it!=keep.end()){ (pos.begin() + (it-keep.begin()))->insert(i); *it = nums[i]; } else{ pos.push_back({i}); keep.push_back(nums[i]); } } vector <int> ans; for(auto iter = pos.rbegin(); iter!=pos.rend(); iter++){ const set<int> &tmp = *iter; if(ans.empty()){ ans.push_back(*tmp.begin()); } else{ for(const auto &t : tmp){ if (nums[t]<nums[ans.back()]){ ans.push_back(t); break; } } } } for(auto iter = ans.rbegin(); iter!=ans.rend(); iter++){ cout << nums[*iter]; if(iter+1 != ans.rend()) cout << " "; } if(T) cout << endl; } return 0; }