最长上升子序列

最长上升子序列

时间限制:1秒        内存限制:128M

题目描述

一个数的序列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).

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

输入描述

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

输出描述

最长上升子序列的长度。

样例

输入

7
1 7 3 5 9 4 8

输出

4

提示

另一组测试数据

输入

43
486 341 527 189 740 490 388 989 489 711 174 305 844 971 492 998 954 832 442 424 619 906 154 293 395 439 735 738 915 453 748 786 550 871 932 693 326 53 904 732 835 354 364

输出

11 

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+2;
long long a[N],sum[N],maxx=1; 
int main() {
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		sum[i]=1;
		for(int j=1;j<=i;j++){
		if(a[i]>a[j]&&sum[i]<sum[j]+1){
			sum[i]=sum[j]+1;
		}
	}
		if(maxx<sum[i]){
			maxx=sum[i];
		}
	} 
	cout<<maxx<<endl;
	return 0;
	}

解题步骤:

  1. 首先,我们需要读取输入的序列长度和序列本身。
  2. 然后,我们可以使用动态规划的方法来求解最长上升子序列的长度。我们可以定义一个数组dp,其中dp[i]表示以第i个元素结尾的最长上升子序列的长度。状态转移方程为:dp[i] = max(dp[j]) + 1,其中0 <= j < i且nums[j] < nums[i]。
  3. 最后,我们输出dp数组中的最大值,即为最长上升子序列的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值