/*为啥错。。。。*/
#include<iostream>
#include<algorithm>
using namespace std;
int n,a[1002];
int lis(){
	int length=1,L[1002];
	L[0]=a[0];
	for(int i=1;i<n;i++){
		/*如果当前长度为length的数组的第length-1值小于A,就将A入数组,L维护一个递增序列*/
		if(L[length-1]<a[i]) L[length++]=a[i];
		/*否则在数组L中二分查找第一个比a[i]大于或等于的a[i]的位置数下标L[i],并将其赋值为a[i]*/
		/*不会真正找到递增子序列,只会找到其对应长度。例如:3 7 8 2 4 的递增子序列长度为3 L存的数为{2,4,8},将2替换了3将4替换了7*/
		else *lower_bound(L,L+length,a[i])=a[i]; 
	}
	return length;

}
int main(){
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	cout<<lis()<<endl;
    return 0;
}

/*借鉴wu的*/
/*
思路:变量b[1002],b[i]:表示数组长度为i+1的不降序列
每次外层循环遍历到i时,从内层循环j从0遍历到i中查找此时比i小的数,
如果小的话,将此时b[j]加1 并且与原b[i]比较
取最大值。
例如:3 2 4 5 7 8 初始b[]={1};
开始遍历,
i=0时,b[0]=1;
i=1时,b[1]=1;(在j=0--i中没比2小的)
i=2时,b[2]=2;(在j=0--i中找到比4小的其中为a[0]=3和a[1]=2且他们的b都是1,
所以此时b[2]=max(b[2],b[0]+1)=2然后循环j+1,b[2]=max(b[2],b[1]+1))=2。
依次下去。
*/
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[1002],b[1002];
int main(){
	cin>>n;
	for(int i=0;i<n;i++){ cin>>a[i];b[i]=1;}
	for(int i=0;i<n;i++){
		for(int j=0;j<i;j++){
			if(a[i]>=a[j]) b[i]=max(b[i],b[j]+1);
		}
	}
	sort(b,b+n);
	cout<<b[n-1]<<endl;
    return 0;
}

解题思路:






注意事项:





参考代码:

点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论