要求找到这组数据中连和最大的子序列
//暴力枚举 时间复杂度为 O(n^3)
int dfs(int *a,int n){
int max=0,i,j,k,m;
for(i=0;i<n;i++)
for(j=i;j<n;j++){
m=0;
for(k=i;k<=j;k++)
m+=a[k];
if(m>max) max=m;
}
return max;
}
// 前缀和 时间复杂度为 O(n^2)
int dfs(int *a,int n){
int max=0,i,j,m;
for(i=0;i<n;i++){
m=0;
for(j=i;j<n;j++){
m+=a[j];
if(m>max) max=m;
}
}
return max ;
}
// 时间复杂度为 O(n)
//在线处理
1.
int dfs(int *a,int n){
int max=a[0],i,m=a[0];
for(i=1;i<n;i++){
if(m+a[i]>0) m+=a[i];
else m=0;
if(m>max) max=m;
}
return max ;
}
2.
int dfs(int a[],int n){
int sum=0,maxsum=0;
for(int i=0;i<n;i++){
sum+=a[i] ;
if(sum>maxsum) maxsum=sum;
else if(sum<0) sum=0;
}
return maxsum;
}
#include<iostream>
using namespace std ;
int dfs(int *a,int n){
int max=0,i,j,k,m;
for(i=0;i<n;i++)
for(j=i;j<n;j++){
m=0;
for(k=i;k<=j;k++)
m+=a[k];
if(m>max) max=m;
}
return max;
}
int main()
{
int a[]={31,-41,59,26,-53,58,97,-93,-23,84};
int n=sizeof(a)/sizeof(int) ;
cout << dfs(a,n) ;
return 0;
}