问题描述:
给出指定整数序列,求出最大的子序列和
解决思路:
方法一从i到j进行扫描,复杂度为O(N3);
方法二每次两重循环,复杂度为O(N2);
方法三循环一次,复杂度为O(N3),但是对输入所有数据为负数时是不成立的;
算法实现:
#include<stdio.h>
int MaxSeqSumOfN3(int a[],int n);
int MaxSeqSumOfN2(int a[],int n);
int MaxSeqSumOfN(int a[],int n);
int main() {
int a[100] = {0};
int n;
while(scanf("%d",&n)!=EOF){
int i ;
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
printf("%d\n",MaxSeqSumOfN3(a,n));
printf("%d\n",MaxSeqSumOfN2(a,n));
printf("%d\n",MaxSeqSumOfN(a,n));
}
}
//求a[i]到a[j]之间的最大值
int MaxSeqSumOfN3(int a[],int n) {
int i,j,k;
int MaxSum = 0;
for(i=0;i<n;i++){
for(j=i;j<n;j++){
int ThisSum = 0;
for(k=i;k<=j;k++){
ThisSum += a[k];
}
if(ThisSum>MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSeqSumOfN2(int a[],int n) {
int i,j;
int MaxSum = 0;
for(i=0;i<n;i++){
int ThisSum = 0;
for(j=i;j<n;j++){
ThisSum += a[j];
if(ThisSum>MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSeqSumOfN(int a[],int n) {
int i;
int ThisSum = 0;
int MaxSum = 0;
for (i = 0; i < n; i++) {
ThisSum +=a[i];
if(ThisSum > 0){
if(ThisSum > MaxSum)
MaxSum = ThisSum;
}else{
ThisSum = 0;
}
}
return MaxSum;
}