標籤:blog art for io re div
求一個數組的相加和最大的連續子數組
思路:
一直累加,只要大於0,就說明當前的“和”可以繼續增大,
如果小於0了,說明“之前的最大和”已經不可能繼續增大了,就從新開始,
result=max{result+arr[i],arr[i]};顯然,若result>0,則可以繼續相加,否則,就重新開始。
#include<stdio.h>#define INF 65535int Maxsum(int * arr, int size){ int maxSum = -INF; int sum = 0; for(int i = 0; i < size; ++i) { if(sum < 0) { sum = arr[i]; }else { sum += arr[i]; } if(sum > maxSum) { maxSum = sum; } } return maxSum;}void Maxsum_location(int * arr, int size, int & start, int & end){ int maxSum = -INF; int sum = 0; int curstart = start = 0; /* curstart記錄每次當前起始位置 */ for(int i = 0; i < size; ++i) { if(sum < 0) { sum = arr[i]; curstart = i; /* 記錄當前的起始位置 */ }else { sum += arr[i]; } if(sum > maxSum) { maxSum = sum; start = curstart; /* 記錄並更新最大子數組起始位置 */ end = i; } }}void main(){ /* 測試案例 */ //int arr[] = {8,-10,3,60,-1,-6}; int arr[] = {1,-2,3,5,-1,2}; int arr2[] = {-9,-2,-3,-5,-4,-6}; int len = sizeof arr / sizeof(int); int len2 = sizeof arr2 / sizeof(int); /* 測試實現 */ printf("%d %d\n",Maxsum(arr,len),Maxsum(arr2,len2)); /* 返回起始位置 */ int start = -1; int end = -1; Maxsum_location(arr,len,start,end); printf("start:%d end:%d\n", start, end); Maxsum_location(arr2,len2,start,end); printf("start:%d end:%d\n", start, end); }