题目描述
这是一个简单的动规板子题。
给出一个由 n(n≤5000) 个不超过 10^6 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。
最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。
题目限制:
输入格式
第一行,一个整数 n,表示序列长度。
第二行有 n 个整数,表示这个序列。
输出格式
一个整数表示答案。
输入输出样例
解题思路:
这是一个动态规划的问题,要求出第 i 个数的最长上升子序列,就等于前 i-1 个数中结尾的数比他小的最长上升子序列数最大的那个+1。
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,f[5001]={1},max_;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
f[0]=1;
for(int i=1;i<n;i++)
{
max_=0;
for(int j=0;j<i;j++) //记录前第i-1个数的最长上升子序列
{
if(a[j]<a[i])
{
max_=max(max_,f[j]);
}
}
f[i]=max_+1; //记得+1
}
sort(f,f+n);
cout<<f[n-1]; //输出最大的
return 0;
}