51nod 1134 最长递增子序列 DP

来源:互联网 发布:乱世佳人英文影评知乎 编辑:程序博客网 时间:2024/06/05 08:14
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。


DP【i】表示以i结尾的最长公共子序列长度是多少。

我们枚举1-N,变量为i。

对于每个i,我们再遍历1-i,变量为j。

如果啊a[i]>a[j],dp[i]=max(dp[i],dp[j]+1).



最后我们遍历dp,找最大值即可

#include <iostream>
#include<stdio.h>
using namespace std;
int a[51100];
int dp[51100];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    dp[1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(a[i]>a[j])
            {
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
    }
    int ans=-1;
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,dp[i]);
    }
    cout<<ans+1<<endl;
}

原创粉丝点击