在一片博文看见如下求最长增长子序列的算法如下复杂度为O(n²):
#include <iostream>
using namespace std;
int lis(int A[], int n){
int *d = new int[n];
int len = 1;
for(int i=0; i<n; ++i){
d[i] = 1;
for(int j=0; j<i; ++j)
if(A[j]<=A[i] && d[j]+1>d[i])
d[i] = d[j] + 1;
if(d[i]>len) len = d[i];
}
delete[] d;
return len;
}
int main(){
int A[] = {
5, 3, 4, 8, 6, 7
};
cout<<lis(A, 6)<<endl;
return 0;
}
偶然看完编程珠玑第八章后,深受启发,改进后的代码如下(复杂度为O(n)) :
#include<iostream>
using namespace std;
int a[10001];
int max(int a,int b){
return a>b?a:b;
}
int main(){
int T;
cin>>T;
while(T--){
int N;
cin>>N;
for(int i=0;i<N;i++)
cin>>a[i];
int maxsofar=0;
int maxendinghere=1;
for(int i=1;i<N;i++){
maxendinghere=a[i]>a[i-1]?maxendinghere+1:1;
maxsofar=max(maxsofar,maxendinghere);
}
cout<<maxsofar<<endl;
}
}
第一次写文章,如有不足,请多指教