首先考虑的是末尾的状态 求从初始到第i个数的最长上升子序列就是求小于第i个数的那个数的最长上升子序列+1 因此 我们从头开始找到第n个数的上升子序列
代码示例hdu1257
#include<iostream>
#include<cstring>
using namespace std;
int n,high[10005],dp[10005],maxx=0;
int main()
{
while(cin>>n)
{
maxx=0;
memset(dp,1,sizeof(dp));
for(int i=1;i<=n;i++) //输入高度
{
cin>>high[i];
}
for(int i=1;i<=n;i++)
{
dp[i]=1; //每次初始化为1
for(int j=1;j<i;j++) //找小于第i个数的值 求他的上升子序列
{
if(high[i]>high[j])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
maxx=max(maxx,dp[i]);
}
cout<<maxx<<endl;
}
}