C++动态规划算法之最长上升子序列



最长上升子序列

Description

一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2, …, aN),我们可以得到一些上升的子序列(ai1,ai2, …,aiK),这里1 <=i1 < i2 < … <iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

Input
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。
Output

最长上升子序列的长度。

Sample Input




7
1 7 3 5 9 4 8

Sample Output




4

这道题是动态规划的入门重要例题,是迈进动态规划的第一步,十分重要。

代码如下:

#include<cstdio>
#include<cstring>
int num[4][1001],n;
main()
{
	memset(num[2],1,sizeof(num[2]));
	memset(num[3],0,sizeof(num[3]));
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&num[1][i]);
	for(int i=n-1;i>0;i--)
	{
		int x=0,y=0;
		for(int j=i+1;j<=n;j++)
			if(num[1][i]<num[1][j]&&num[2][j]>x)
			{
				x=num[2][j];
				y=j;
			}
		if(x){num[2][i]=x+1;num[3][i]=y;}
	}
	int t=0,sum=0;
	for(int i=1;i<=n;i++)
		if(num[2][i]>=num[2][t])t=i; 
	while(t)
	{
		t=num[3][t];
		sum++;
	}
	printf("%d\n",sum);
}



    原文作者:动态规划
    原文地址: https://blog.csdn.net/C20190413/article/details/73070154
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞