最大子数组

来源:互联网 发布:如何去日本工作知乎 编辑:程序博客网 时间:2024/05/21 06:45

最近开始看算法导论,看一点就写一点,必须提高自己的编程能力,毕竟要养活我将来的老婆(现在还在当兵的女朋友)。第一次写,都是简单的老掉牙的题目。求谅解。另外算法导论(第三版第38页)有对此题目的另一个解法(分治法),我看着伪代码写了许久,但没运行出来,求诸位大神们指教!好了,废话不多说了。开始看题目。

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间负责度为O(n)。

思路:就是动态规划啦  从数组第一个元素开始逐个加,和如果是负数就舍弃,和(nowsum)为正的话,就将此次的和(nowsum)与前一次算的和(sum)比较,nowsum>sum的话,就将nowsum赋值给sum。从而保证sum是最大子数组的和。

代码如下:

void main (){
int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
 //全是负数的话就是求最大的一个元素   代码没写
 //动态规划做         用分治法没运行出来
int i,j,sum=0;
int nowsum=0;
for(i=0;i<(sizeof(A)/sizeof(int));i++)

nowsum+=A[i];
if (nowsum<0) {
 nowsum=0;
}
if(sum<nowsum){
 sum=nowsum;
}
}
printf("%d\n",sum); 
}

 

0 0