LIS——最长递增子序列问题

最长递增子序列,举一个例子:

A={5,6,7,4,2,8,3},它的最长递增子序列是5,6,7,8.

转载一下大佬写的吧,大佬写的真的好,好好学习一下,认真体会:https://blog.csdn.net/ltrbless/article/details/81318935

真题实战:http://lx.lanqiao.cn/problem.page?gpid=T73。

这个题我们要知道一点:

最少下降子序列的个数(最少的拦截系统)=最长不下降子序列的长度(重点)

我采取的dp做法,所以就用dp来讲讲:

#include<bits/stdc++.h>
 using namespace std;
 int dp[2010];//统计可以最多可以拦截多少导弹
 int up[2010];//统计最少几台拦截装置 
 int ans,cnt;//分别对应上面 
 int a[2010],n;
 int main()
 {
 	ios::sync_with_stdio(false);
 	while(1)
	{
		scanf("%d",&a[n++]);
		char b=getchar();
		if(b=='\n')
		break;
	}
	for(register int i=0;i<n;i++)
	{
		dp[i]=1;
		up[i]=1;
		for(register int j=0;j<i;j++)
		{
			if(a[i]<a[j])//下降子序列 
			{
				dp[i]=max(dp[i],dp[j]+1);
			}
			else//最长不下降子序列=下降子序列的个数 
			{
				up[i]=max(up[i],up[j]+1);
			}
		}
		ans=max(ans,dp[i]);
		cnt=max(cnt,up[i]);
	}
	cout<<ans<<endl<<cnt;
	return 0;
 }

  对于上面问题的证明罗勇军老师的书里已经有严格证明,膜拜大佬就完事了

 

posted @ 2022-02-13 23:57  江上舟摇  阅读(53)  评论(0编辑  收藏  举报