问题:求一个数组的连续和的最大值
思路:第一步,将数组合并成正负交错的数组
第二步,对于最大和而言,所取的区间段一定在某个正数处结尾。可以用递归的方式求得第i处结尾的最大和与第i+2处结尾的最大和的关系。
源码:
#include <iostream> using namespace std; int revise(int *A, int n){ int j=0; int k=0; for(int i=0;i<n;i++){ if(i==n-1||A[i]*A[i+1]<0){ int temp=0; for(int t=j;t<=i;t++){ temp+=A[t]; } A[k++]=temp; j=i+1; } } return k; } int calMax(int *A,int n){ if(n==1) return A[0]; int temp,i; if(A[0]>=0){ temp=A[0];i=0; }else{ temp=A[1];i=1; } int max=temp; while(i+2<n){ temp=(temp+A[i+1]>0)?(temp+A[i+1]+A[i+2]):A[i+2]; max=max>temp?max:temp; i+=2; } return max; } void main(){ cout<<"输入(第一行输入测试组数,接下来每行第一个数输入数组大小,剩下为数据):"<<endl; int testNo; cin>>testNo; int *n=new int[testNo]; int *result=new int[testNo]; int i=0; int inputNo=testNo; while(inputNo--){ cin>>n[i]; int *arr=new int[n[i]]; for(int k=0;k<n[i];k++){ cin>>arr[k]; } int t=revise(arr,n[i]); result[i]=calMax(arr,t); i++; } i=0; cout<<"输出:"<<endl; while(i<testNo){ cout<<result[i]<<endl; i++; } }