1. 实验目的
理解分治法。
2. 实验内容
用分治法求解最大子段和问题
测试用例:-20, 11,-4, 13,-5,-2。
3. 实验过程
报告撰写具体要求:上述实验内容要求写出源代码及运行结果。
#include<stdio.h>
int maxSum(int data[], int first, int end)
{
//如果长度为1,直接输出答案
if (first == end)
return data[first];
else
{
int sum = 0;
int mid = (first + end) / 2;
int sumLeft = maxSum(data, first, mid); //先求分界点左边的最大值
int sumRight = maxSum(data, mid + 1, end); //再求分界点右边的最大值
//最后求跨越分界点的最大值
int s1 = 0, lefts = 0;
for (int i = mid; i >= first; i--)
{
lefts += data[i];//往左求和
if (lefts > s1)
s1 = lefts;//取s1为最大值
}
int s2 = 0, rights = 0;
for (int i = mid + 1; i <= end; i++)
{
rights += data[i];//往右求和
if (rights > s2)
s2 = rights;//取s2为最大值
}
//最大值为跨区间的最大值相加的和
sum = s1 + s2;
//最大子段和为左,右,跨区间中的最大值
if (sumLeft > sum)
sum = sumLeft;
if (sumRight > sum)
sum = sumRight;
return sum; //情况1、2、3中,返回最大的那个
}
}
int main(int argc, char *argv[])
{
int data[20] = {0, -20, 11, -4, 13, -5, -2}; //第0个位置不用
printf("最大子段和:%d", maxSum(data, 1, 6));
return 0;
}