最大子序列和

    xiaoxiao2021-03-25  69

       三种最大子序列和问题解法

    #include<stdio.h> int MaxsubseqSum4(int A[],int N); int MaxsubseqSum1(int B[],int n); //最大子列和 int main() { int a[8]={-1,3,-2,4,-6,1,6,-1}; int k,i; k=8; k=MaxsubseqSum4(a,k); printf("%d",k); k=MaxsubseqSum1(a,k); printf("%d",k); return 0; } int MaxsubseqSum4(int A[],int k)  //最优解法,只用一层循环,从第一个开始小于零丢弃,只遍历一次就能得出最大子序列和。 {   int Maxsum,thissum;   int i;   thissum=0;   Maxsum=0;    for(i=0;i<k;i++)  {   thissum+=A[i];   if(thissum>Maxsum)    Maxsum=thissum;    else if(thissum<0)  thissum=0; } printf("%d",Maxsum); return Maxsum; } int MaxsubseqSum1(int B[],int k) { int ThisSum,Maxsum=0; //三层嵌套for循环  时间复杂度n^3。 很麻烦。 先从0加到最后 再从1加到最后  。。。。如果i=1,j=3  那么  thissum=a1+a2+a3     j=4  重复(a1+a2+a3)+a4   

    int i,j,l; for(i=0;i<k;i++)  {    for(j=i;j<k;j++) for(l=i;l<j;l++)//第三次 { ThisSum+=B[l]; if(ThisSum>Maxsum) Maxsum=ThisSum;       // } } return Maxsum; } int MaxsubseqSum2(int B[],int k)   //递推 { int thissum,maxsum=0; int j,i; for(i=0;i<k;i++) { thissum=0; for(j=i;j<k;j++) { thissum+=B[j];   // 3 -5 8 -7 6   //递推将上面的进行了优化   Sum(i,j)=sum(i,j-1)+aj   通过这个公式,减少了一层for循环。

    if(thissum>maxsum)   //  maxsum=thissum; } } }

    转载请注明原文地址: https://ju.6miu.com/read-34289.html

    最新回复(0)