【DP】最长上升子序列

最长上升子序列

题目

设有整数序列b1,b2,b3,…,bm,若存在下标i1<i2<i3< …<in,且bi1<bi2<bi3< …<bin,则称 b1,b2,b3,…,bm中有长度为n的不下降序列bi1 , bi2 ,bi3 ,…,bin 。求序列b1,b2,b3,…,bm中所有长度(n)最大不下降子序列

输入

第一行n
第二行 整数序列

输入样例

10
3 18 7 14 10 12 23 41 16 24

输出

最大长度n和所有长度为n的序列个数

输出样例

6

思路

把每个数与前面的数组成的最长上升子序列的长度记录在一维数组中。 记录的数就是前面小于它的数中最长上升子序列的长度最长的数+1。

代码

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int n,f[1005],a[1005],m=0;//初始化
	scanf("%d",&n);//读入
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=1;//读入,并假设每个数与前面的数组成的最长上升子序列的长度都为1
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<i;j++)
		 if(a[i]>a[j])
		  f[i]=max(f[i],f[j]+1);//求每个数与前面的数组成的最长上升子序列的长度
		m=max(m,f[i]);//求其中的最大值
	}
	printf("%d",m);//输出最大值
}

猜你喜欢

转载自blog.csdn.net/weixin_43346722/article/details/82956191