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)
{
return 0;
}
else
{
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--)
{
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++)
{
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));
}
}
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;
}
仅供参考!
|