您的位置:首页 > 编程语言 > C语言/C++

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

2018-03-21 22:20 302 查看
题目描述:
数组中整数有正有负求一连续子段,使得和最大化
例如:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: