rt
代码如下
//求子数组的最大和
//利用的是dp的思想,依次遍历数组中的每个元素,把他们相加,如果加起来小于0,则
//把当前元素之和清为0,否则则和最大和比较,更新最大和,最后得到必是子数组的最大和
//例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
#include<stdio.h>
#include<stdlib.h>
bool maxSubarray(int data[], int size,int &max)
{
if (size<=0)
{
printf("error array size\n");
return false;
}
int sum = 0;
int begin=0;
int end=0;
max=-(1<<31);
for(int i=0;i<size;i++)
{
sum +=data[i];
if(sum>max)
{
max=sum;
end=i;
}
else if(sum<0)
{ begin=(i+1)%size;//注意这里为啥要对size取余数。
sum=0;
}
}
printf("begin=%d end=%d\n",begin,end);
return true;
}
int main()
{
int data[]={1, -2, 3, 10, -4, 7, 2, -5};
int max;
if( maxSubarray(data,8,max))
printf("%d\n",max);
int data2[]={-1, -2, -3, -10, -4, -7, -2, -5};
if( maxSubarray(data2,8,max) )
printf("%d\n",max);
getchar();
system("pause");
return 0;
}