dp-最长子序列

问题大意:给出一组数,求这个数列的最长子序列
解题思路:从1到N,求以第i个数结尾的最长子序列

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int arr[1000],arrlen[1000];
//arr数组用于储存数据,arrlen数组用于储存以arr[i]为结尾的最长子序列
int N,maxlen,se=sizeof(arrlen);
//maxlen用于输出最大长度,se用于记录arrlen数组的长度,以便于进行初始化
int main()
{
    while(cin>>N)
    {
        maxlen=1;
        memset(arrlen,0,se);
        arrlen[1]=1;
        
        //这里不能直接将arrlen数组初始化为1,详情请看
        //(https://blog.csdn.net/Move_now/article/details/52745887)
        
        for(int i=1;i<=N;i++)
            cin>>arr[i];
        for(int i=2;i<=N;i++)
        {
            int mx=0;//记录当前最长子序列的长度
            for(int j=1;j<=i-1;j++)
            {
                if(arr[j]<arr[i]&&arrlen[j]>mx)
                    mx=arrlen[j];
                 //如果arr[i]之前的元素小于arr[i]并且对应的长度大于当前已知的最大长度,
                //就代表此时这个长度加上arr[i]是最大的
            }
            arrlen[i]=mx+1;//因为判断的是从1到i-1,所以mx要加一
            if(arrlen[i]>maxlen)
                maxlen=arrlen[i];
        }
        printf("%d\n",maxlen);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42891420/article/details/87191646