您的位置:首页 > 其它

最长连续递增子序列

2017-10-28 11:59 316 查看
自己写的:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
struct {
int fir;
int ed;
int cnt;
}mymax;//记录最长子序列的相关信息
long long a[1e5+10];//开个大数组,(*^__^*)
int main(){
int fir=0;//临时的起点,初始化为0
mymax.fir=0;//最长子序列的起点也初始化为0
mymax.cnt=0;
int cnt=1;//临时序列长度
int N;
cin >> N;
mymax.ed=N-1;//顺序的情况,就全部输出
if(N>0)//保持代码鲁棒性,O(∩_∩)O哈哈~
cin >> a[0];
for(int i=1;i<N;i++){
scanf("%lld",&a[i]);
if(a[i]>a[i-1])//比前一个大,长度加一
cnt++;
else{
if(mymax.cnt<cnt){//比前一个小,此序列到此为止,如果为最长的要大就更新最长子序列
mymax.cnt=cnt;
mymax.fir=fir;
mymax.ed=i-1;
}
cnt=1;
fir=i;//下一次从i开始
}
}
for(int i=mymax.fir;i<=mymax.ed;i++){
cout << a[i];
if(i<mymax.ed)
putchar(' ');
}
return 0;
}


同学写的:

#include<stdio.h>
const int MAXN = 1e5+10;
int a[MAXN];
int dp[MAXN];
int main(void){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
dp[0]=1;
for(int i=1;i<n;i++){
if(a[i]>a[i-1]){
dp[i]=dp[i-1]+1;
}else{
dp[i]=1;
}
}
int ans=0,flag;
for(int i=0;i<n;i++){
if(ans<dp[i]){
ans=dp[i];
flag=i;
}
}
for(int i=flag-dp[flag]+1;i<=fl
4000
ag;i++){
if(i==flag){
printf("%d\n",a[i]);
}else{
printf("%d ",a[i]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: