代码实现如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
    int arr[500], n, dp[500], ans = -1;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
        scanf("%d", &arr[i]); 
    for(int i = 1; i <= n; i++){
        dp[i] = 1; //初始化
        for(int j = 1; j < i; j++){
            if(arr[j] < arr[i]) // 如果求最大下降子序列则反之
                dp[i] = max(dp[i], dp[j] + 1);
        }
        ans = max(dp[i], ans);
    }
    /* ********************************************** */
 
    printf("最长子序列的个数为: %d", ans);
    return 0;
}

可进行优化,优化后代码为:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn=1000+10;
int dp[maxn],ans[maxn];

int b_search(int x,int s,int len)
{
    while(s<len)
    {
        int mid=s+(len-s)/2;
        if(dp[mid]>=x)
        {
            len=mid;
        }
        else
        {
            s=mid+1;    
        }
    }
    return s;
}

int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&ans[i]);
        }
        int len=1;
        dp[1]=ans[1];
        for(int i=2;i<=n;i++)
        {
            if(ans[i]>dp[len])
            {
                dp[++len]=ans[i];
            }
            else
            {
                int p=b_search(ans[i],1,len);
                dp[p]=ans[i];
            }
        }
        for(int i=1;i<=len;i++)
        {
            cout<<dp[i]<<" ";
        }
        cout<<endl;
    }
}