#includeusing namespace std; int a[100]; int f[100]; int main(){ int n,ans = -10; cin>>n; //当只有一个字符的时候 最长上升子序列为1 for(int i=1;i<=n;i++) f[i] = 1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=2;i<=n;i++){ for(int j=1;j a[j]) //满足a[i] > a[j] 该序列才是上升的 //当前最长子序列长度由上一次的最长子序列更新 f[i] = max(f[i], f[j] + 1); ans = max(f[i],ans); } cout< 输出序列 #includeusing namespace std; int a[100]; int f[100];//状态 int p[100];//记录前驱元素 //这个递归类似并查集 //通过最后的下标一直递归寻找前面的元素 void find(int i){ if(p[i]) find(p[i]); printf("%d ",a[i]); } int main(){ int n,ans = -10,flag; cin>>n; //当只有一个字符的时候 最长上升子序列为1 for(int i=1;i<=n;i++) f[i] = 1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=2;i<=n;i++){ for(int j=1;j a[j] && f[j] + 1 > f[i]){ //满足a[i] > a[j] 该序列才是上升的 //当前最长子序列长度由上一次的最长子序列更新 f[i] = f[j] + 1; p[i] = j;//记录前驱 } if(f[i] > ans ){ ans = f[i]; flag = i;//标记最大值i } //flag记录的是最长子序列最后一个元素的下标 } find(flag); //cout< return 0; } 测试样例
10 2 3 21 11 4 -5 2 37 9 13



