个人原创,转载请注明出处,谢谢!
一、 目的
input: n个元素的数组;
output: 在数组中查找相邻数的最大和;
constrain: 如最大和为负数,则最大和为0,即一个也不选。
二、算法原理
假设输入数组x[10]如下图,则最大和为187,即子向量x[2…6]:
另外:
如果数组内各元素均为正数,则最大和为所有元素的和;
如果数组内各元素均为负数,则最大和为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;
}
四、代码注解
/*使用随机数[-1,1]填充数组,使得数组内元素有正有负,且随机排布*/
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;
/*使用i和j两个游标,来不断计算[i,j]内的各相邻子向量的元素和,如[i,j],[i,j+1],…,并与之前记忆的最大和maxsofar进行比较*/
for (i = 0; i < n; i++) {
/*不要忘记reset sum为0*/
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;
}