C++ 显示最长的递增子序列 #包括 使用名称空间std; int main() { int a[]={0,8,4,12,2,10,6,1,9,5,13,3,11,7}; int b[50],i,j,n,ls[50]; n=sizeof(a)/sizeof(a[0]); int maxlen=0,end=-1; b[0]=-1; 对于(i=0;i

C++ 显示最长的递增子序列 #包括 使用名称空间std; int main() { int a[]={0,8,4,12,2,10,6,1,9,5,13,3,11,7}; int b[50],i,j,n,ls[50]; n=sizeof(a)/sizeof(a[0]); int maxlen=0,end=-1; b[0]=-1; 对于(i=0;i,c++,lis,C++,Lis,实际上您编写了正确的序列,但顺序相反,并且跳过了第一个(最后一个)元素 您可以将最后一个元素更改为包含第一个元素 #include<iostream> using namespace std; int main() { int a[]={0,8,4,12,2,10,6,1,9,5,13,3,11,7}; int b[50],i,j,n,ls[50]; n=sizeof(a)/sizeof(a[0]); int maxlen=0,end=-1;

实际上您编写了正确的序列,但顺序相反,并且跳过了第一个(最后一个)元素

您可以将最后一个元素更改为包含第一个元素

#include<iostream>
using namespace std;
int main()
{
    int a[]={0,8,4,12,2,10,6,1,9,5,13,3,11,7};
    int b[50],i,j,n,ls[50];
    n=sizeof(a)/sizeof(a[0]);
    int maxlen=0,end=-1;
    b[0]=-1;
    for(i=0;i<n;i++)
    {
        ls[i]=1;
        for(j=0;j<i;j++)
        {
            if(a[i]>a[j] && ls[i]<ls[j]+1)
            {
                ls[i]=ls[j]+1;
                b[i]=j;
            }
        }
        if(ls[i]>maxlen)
        {
            end=i;
            maxlen=ls[i];
        }
    }

    cout<<maxlen<<endl;
    for(int k=end;b[k]!=-1;k=b[k])
    {
        cout<<a[k];
    }
            return 0;
}

我刚刚运行了您的代码,它打印了5,表示最长递增序列的长度。我看不到超过2的递增子序列……我认为您需要再次检查逻辑,以便首先查找最长序列。@jlars62-最长序列问题通常不要求子集是连续的。@jlars62
0,2,6,9,13
是长度为5的子序列。子序列不需要在原始序列中是连续的。您的权利我的错!很抱歉造成混淆。
vector<int> v;
for(int k=end;k!=-1;k=b[k])
{
    cout << a[k] << ' ';
}
vector<int> v;
for(int k=end;k!=-1;k=b[k])
{
    v.push_back(a[k]);
}
reverse(v.begin(), v.end());
for(int x: v) {
    cout << x << ' ';
}