#include "stdafx.h" //返回下标 int maxSum(int * arr, int len, int & left, int & right) { int start = arr[0]; int sum = arr[0]; left=0; right=0; int cur_left=0,cur_right=0; for(int i=1;i<len;i++) { if(start < 0) { start = arr[i]; cur_left=i; cur_right=i; } else { start+=arr[i]; cur_right=i; } if(start > sum) { sum=start; left=cur_left; right=cur_right; } } return sum; } //首尾相连 int maxSum2(int * arr, int len) { int left,right; int sum = maxSum(arr,len,left,right); //找到arr[0]开始的和最大的一段 int max=arr[0]; int temp=max; int pos=0; for(int i=1;i<len;i++) { temp+=arr[i]; if(temp>max) { max=temp; pos=i; } } //找到arr[n-1]开始往后的和最大的一段 max=arr[len-1]; temp=max; int pos2 = len-1; for(int i=len-2;i>0;i--) { temp+=arr[i]; if(temp>max) { max=temp; pos2=i; } } //把两段拼接起来 int sum2=0; if(pos<pos2) { for(int i=0;i<=pos;i++) sum+=arr[i]; for(int i=pos2;i<len-1;i++) sum+=arr[i]; } else { for(int i=0;i<len;i++) sum2+=arr[i]; } return sum2>sum?sum2:sum; } //首尾相连,方法2,先求出和最小的一段子数组,剩下的就是和最大的 int maxSum3(int * arr, int len) { int start = arr[0]; int sum = arr[0]; for(int i=1;i<len;i++) { if(start > 0) start = arr[i]; else start+=arr[i]; if(start < sum) sum=start; } int totalSum = 0; for(int i=0;i<len;i++) totalSum += arr[i]; return totalSum - sum; } int _tmain(int argc, _TCHAR* argv[]) { int arr[5] = {4,-4,-5,-2,7}; int left,right; int sum = maxSum(arr,5,left,right); printf("%d %d %d\n",sum ,left,right); sum = maxSum2(arr,5); printf("%d\n",sum); sum = maxSum3(arr,5); printf("%d\n",sum); return 0; }