编程珠矶学习笔记(8)--查找最大和(二次算法O(n^2))

个人原创,转载请注明出处,谢谢!

一、   目的

input: n个元素的数组;

output: 在数组中查找相邻数的最大和;

constrain: 如最大和为负数,则最大和为0,即一个也不选。

二、算法原理

假设输入数组x[10]如下图,则最大和为187,即子向量x[2…6]:

max sum 

另外:

如果数组内各元素均为正数,则最大和为所有元素的和;

如果数组内各元素均为负数,则最大和为0

 

三、代码

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

#define MAXN 10000000

int n;

float x[MAXN];

 

 

void sprinkle()

{  

int i;

    for (i = 0; i < n; i++) {

        x[i] = 1 - 2*( (float) rand()/RAND_MAX);

}

}

 

float get_max_sum()

{  

int i, j, k;

    float sum, maxsofar = 0;

    for (i = 0; i < n; i++) {

        for (j = i; j < n; j++) {

            sum = 0;

            for (k = i; k <= j; k++) {

                sum += x[k];

  }

 

            if (sum > maxsofar) {

                maxsofar = sum;

  }

        }

}

    return maxsofar;

}

 

int main()

{

    float max_sum;

 

    while (scanf("%d", &n) != EOF) {

        sprinkle();

        start = clock();

        max_sum = -1.0;

thisans = get_max_sum();

printf(“max sum = %f/n”, max_sum);

   }

    return 0;

}

 

四、代码注解

 

/*使用随机数[-11]填充数组,使得数组内元素有正有负,且随机排布*/

void sprinkle()

{  

int i;

    for (i = 0; i < n; i++) {

        x[i] = 1 - 2*( (float) rand()/RAND_MAX);

}

}

 

/*求数组内相邻元素的最大和*/

float get_max_sum()

{  

int i, j, k;

float sum, maxsofar = 0;

 

/*使用ij两个游标,来不断计算[ij]内的各相邻子向量的元素和,如[ij][ij+1],,并与之前记忆的最大和maxsofar进行比较*/

for (i = 0; i < n; i++) {

 

    /*不要忘记reset sum0*/

 sum = 0;

        for (j = i; j < n; j++) {

 

            /*i开始不断的累加,直到n-1*/

            sum += x[k];           

 

/*如果新的和sum大于之前记忆的和maxsofar,则用新和替换老的    最大和*/

if (sum > maxsofar) {

                maxsofar = sum;

}

        }

}

 

    return maxsofar; /*最终找到最大和*/

}

 

int main()

{

    float max_sum;

 

while (scanf("%d", &n) != EOF) {

 

   /*初始化数组*/   

       sprinkle();

 

       max_sum = get_max_sum();

 

printf (“max sum = %f/n”, max_sum);

   }

    return 0;

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值