团队项目:首尾相接的整数数组最大子数组的和
题目要求:
输入一个整形数组,数组里有正也有负。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组首尾相接,那么最大子数组的和。
设计思想:
首先定义数组中第一个数为最大值,若第一个数为负数,舍弃,若第一个数为正数,看下一个元素是否为正,若为正,则相加,用tmp记录最大值。然后再定义数组中最后一个元素为最大值,判断方法与上相同,直至找到最大子数组和。
出现问题:一开始思路理不清楚,不知道怎样将数组连接成环。
解决方案:通过参考网上资料,我俩总算可以理清思路,编写出程序运行出正确结果。
程序主代码:
#include <stdio.h>
int Max_Sub (int arr[], int n){
int i;
int tmp;
int max;
tmp = max = arr[0];
for (i=1; i<n; ++i){
if (tmp > 0)
tmp += arr[i];
else
tmp = arr[i];
if (tmp > max)
max = tmp;
}
return max;
}
int Max_Left (int arr[], int n, int * left){
int i;
int tmp;
int max;
tmp = max = arr[0];
*left = 0;
for (i=1; i<n; ++i){
tmp += arr[i];
if (tmp > max){
max = tmp;
*left = i;
}
}
return max;
}
int Max_Right (int arr[], int n, int * right){
int i;
int tmp;
int max;
tmp = max = arr[n-1];
*right = 0;
for (i=n-2; i>=0; --i){
tmp += arr[i];
if (tmp > max){
max = tmp;
*right = i;
}
}
return max;
}
int Min_Sub (int arr[], int n){
int i;
int tmp;
int min;
tmp = min = arr[0];
for (i=1; i<n; ++i){
if (tmp < 0)
tmp += arr[i];
else
tmp = arr[i];
if (tmp < min)
min = tmp;
}
return min;
}
int main(void){
int n;
int arr[100000];
int max;
int min;
int left_max;
int right_max;
int left;
int right;
int mmax;
int i;
int flag;
while (scanf ("%d", &n) != EOF){
flag = 0;
for (i=0; i<n; ++i){
scanf ("%d", &arr[i]);
if (arr[i] > 0)
flag = 1;
}
if (flag == 1){
max = Max_Sub (arr, n);
left_max = Max_Left (arr, n, &left);
right_max = Max_Right (arr, n, &right);
if (left > right){
mmax = 0;
for (i=0; i<n; ++i)
mmax += arr[i];
min = Min_Sub (arr, n);
mmax -= min;
}
else
mmax = left_max + right_max;
printf ("%d\n", (max > mmax) ? max : mmax);
}
else
printf ("0\n");
}
return 0;
}
运行结果:
队员 :张佳玮 https://www.cnblogs.com/zzzzxiaolan/