7-12 最长递增子序列分数 20

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

输入格式:

输入包含两行。第一行给出一个正整数n(1≤n≤2500)。第二行给出n个由空格分隔的整数(-10^4≤nums[i]≤10^4)。

输出格式:

在一行中输出最长递增子序列的长度。

输入样例1:

8
10 9 2 5 3 7 101 18

输出样例1:

4

输入样例2:

6
0 1 0 3 2 3

输出样例2:

4

输入样例3:

7
7 7 7 7 7 7 7

输出样例3:

1

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

思路是从当前位置的数往前看,也就是用当前位置的数和前面的数比较,结果大于的话,递增序列的长度就是上个位置递增序列的长度+1 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[n],b[n];               //a[n]用来输入数据 ,b[n]用来记录递增数列的长度 
	int i;
	for(i=0;i<n;i++)
	{
		cin>>a[i]; 
		b[i]=0;                //数组b[n]全部初始化为0; 
	}
	int max=-1; 
	                       //最短的的递增数列为1,但是b[i]比序列长小1,最小为0所以只要把max随便定义一个小于0的数即可 
	for(i=0;i<n;i++)                    //这里我们要用到双重循环,外循环遍历每一个数 
	
	{                                  //内循环从当前的数依次跟前面一个数进行大小比较 
	
		for(int j=i-1;j>=0;j--)        //判断条件除了要满足当前的数大于上一个数,还得满足当前的序列长度要小于上一个 
		{                              //位置的序列长度+1, 加一是因为该序列最长为b[j]+1,这样做是为了防止重复加导致 
			if(a[i]>a[j]&&b[i]<=b[j]+1) //构不成递增,比如数据"2,5,3,7"在a[i]为7的时候,会有7>3,7>5,7>2,这样的话此时 
			{                           //序列长度就为4了,但实际上3不大于5,所以只满足两个序列7>3>2和7>5>2,序列长度是3 
			
				b[i]=b[j]+1;           //b[j]储存的是序列长度,如果当前的数大于上一个数,在上一个位置的序列长基础上 
			}                          //加一,就是当前位置的序列长度 
			if(b[i]>max)
			{
				max=b[i];             
			}
		}
	}
	cout<<max+1;//这里的加一是因为要包括当前节点,上面b[i]少了当前位置的数,实际b[i]是序列长-1 
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值