LIS最长上升子序列问题

首先考虑的是末尾的状态 求从初始到第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;
	}
	
}

猜你喜欢

转载自blog.csdn.net/qq_52245648/article/details/119852379