求最长不下降序列【DP】

> Description
设有n(n<=1000)个不相同的整数(小于32767)组成的数列,记为:
    a1,a2,…,an,其中任意两个数不相同。
  例如:3,18,7,14,10,12,23,41,16,24。
  若有 且有 。则称为长度为e的不下降序列。如上例中,3,18,23,24为一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。程序要求,当原始数列给出后,求出最长的不下降数列的长度。


> Input


> Output


> Sample Input
10
3 18 7 14 10 12 23 41 16 24


> Sample Output
6


> 解题思路
最长不下降序列就是指n个数,从n到1(也可以从1到n), 第i个数,从i+1到n,f[i]=比第i个数大的里面f最大的+1,没有的话f[i]=1。
所以这一道题用动态规划来写的话十分简单。


> 代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1001],f[1001];
int main()
{
	int ans=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	 scanf("%d",&a[i]);
	//先读入数据
	f[n]=1;
	//f[n]绝对是1
	for(int i=n-1;i>=1;i--)
	{
		for(int j=i+1;j<=n;j++)
		 if(a[j]>a[i]) //如果这个数大于a[i]
		  if(f[j]>f[i]) f[i]=f[j]; //选出最大数
		f[i]++; //在基础上累加1
	}
	for(int i=1;i<=n;i++)
	 if(f[i]>ans) ans=f[i]; //选出最大数
	printf("%d",ans);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/82805919