1.【题目描述】
求一个序列的最大子段和即最大连续子序列之和
【输入格式】
第一行:一个整数,表示序列的个数
第二行:包含n个以空间间隙的数,表示数列的元素
【输出格式】
输出有一行,即最大连续子序列之和
【输入样例】
8
4 -3 5 -2 -1 2 6 -2
【输出样例】
11
2.【思路】
解决这个题使用分治思想,会出现以下三种情况
1.最大值出现在中间数的左边
2.最大值出现在中间数的右边
3.最大值跨越最大值
3.【代码】
#include <bits/stdc++.h>
using namespace std;
//函数功能:求最大子段和
int fun(int *data,int left,int right)
{
if(left==right) //结束条件
{
if(data[right]<0)//如果小于0就不需要就入序列
{
return 0;
}
else //如果大于0就加入序列
{
return data[right];
}
}
else
{
int mid=(left+right)/2;//二分
int sum1,sum2;
sum1=fun(data,left,mid);//计算左边最大值
sum2=fun(data,mid+1,right);//计算右边最大值
int left_max=0,left_sum=0;
for(int i=mid;i>=left;i--)//计算mid开始左边连续序列最大值
{
left_sum=left_sum+data[i];
if(left_sum>left_max)
{
left_max=left_sum;
}
}
int right_max=0,right_sum=0;
for(int i=mid+1;i<=right;i++)//计算mid+1开始右边连续序列最大值
{
right_sum=right_sum+data[i];
if(right_sum>right_max)
{
right_max=right_sum;
}
}
int sum=left_max+right_max;
return max(sum,max(sum1,sum2));//计算3种情况最大值,然后返回
}
}
int main()
{
int a[1000],n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
cout<<fun(a,1,n);
return 0;
}
仅供参考!