蓝桥杯C语言培训6 分治法与动态规划 最大连续部分和

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhangge138/article/details/79645361
题目描述:
数组中整数有正有负求一连续子段,使得和最大化
例如:
2,4,-7,5,2,-1,2,-4,3
最大连续段:
5,2,-1,2

其最大和为8

代码:

#include<bits/stdc++.h>

int a[9] = {2,4,-7,5,2,-1,2,-4,3};

int f(int a[],int start,int end)
{
    
     if(end - start == 1)
     {
         if(a[start] > 0)return a[start];
         return 0;
     }                                       //递归出口     
 
     int m = (start + end)/2;
     
     int t1 = f(a,start,m);
     int t2 = f(a,m,end);                  //左半边和右半边的连续和最大值 
     
     int t3a = 0;
     int sum = 0;
     for(int i = m ; i >= start ; i--)
     {
         sum += a[i];
         if(sum > t3a)t3a = sum;
     }
     int t3b = 0;
     sum = 0;
     for(int i = m + 1 ; i <= end ; i++)
     {
         sum += a[i];
         if(sum > t3b)t3b = sum;
     }
     int t3 = t3a + t3b;                   //以下标为m的元素为中心的连续和的最大值 
     int max = t3;
     if(t1 > max)max = t1;
     if(t2 > max)max = t2;
     return max;
}

int main()
{
     printf("%d\n",f(a,0,9));
     return 0;
}

猜你喜欢

转载自blog.csdn.net/zhangge138/article/details/79645361