最长上升子序列

来源:互联网 发布:电视直播软件hdp 编辑:程序博客网 时间:2024/06/14 11:38
给定一个序列,求其最长子序列的长度
假设序列为 3 6 2 3 4 
第一个数是 3 前面没有比 3 小的,所以 dp[0]=1;
第二个数是 6 前面 3 比 6 小,所以 dp[1]=dp[0]+1;
第三个数是 2 前面没有比 2 小的,所以 dp[2]=1;

第四个数是 3 前面有比 3 小的,所以 dp[3]=dp[2]+1;

第五个数是 4 前面有比 4 小的,所以 dp[2]=max(dp[0],dp[2],dp[3])+1;

d(i)=max(1,d(j)+1),i>j,且a[i]>a[j];

#include<iostream>
#include<cstring>
using namespace std;
int dp[1000],a[1000];
int main()
{
    int n;
    while(cin>>n)
    {
        int ans=0;//记录长度
        memset(dp,0,sizeof(dp));
        for(int i=0; i<n; i++)
        {
            cin>>a[i];
        }
        for(int i=0; i<n; i++)
        {
            dp[i]=1;
            for(int j=0; j<i; j++)
            {
                if(a[j]<a[i])
                {
                    dp[i]=max(dp[i],dp[j]+1);//不断更新,找出最大值
                }
            }
            ans=max(ans,dp[i]);//不断更新,找出最大值
        }
        cout<<ans<<endl;
    }


    return 0;
}