最长上升子序列朴素方法
特别注意,是子序列而不是子串,所以不要求连续!
不多废话,直接上y氏dp分析图
特别需要注意几点:
+ 集合中可能存在空集,需要判断是否满足上升的要求
+ 如果当前位置不存在上升子序列,那么当前位置的最大长度就应该是1
具体细节请参见代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int a[N],f[N];
int n;
int main()
{
cin>>n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ )
{
f[i]=1;//首先把最大路径设置为1,即不存在上升子序列
for(int j=1;j<i;j++)
{
if(a[j]<a[i])//如果当前位置满足上升子序列的要求
{
//状态转移方程,用上一个状态+1,就是算上当前位置的状态
f[i]=max(f[i],f[j]+1);
}
}
}
int res=0;
for(int i=1;i<=n;i++) res=max(res,f[i]);
cout<<res<<endl;
return 0;
}