#include<stdio.h> #define N 1000 #define INF 10000 int MaxSubSum(int * arr,int n ,int Size) { int maxSum = -INF; int sum = 0; int i=0; for( i = n; i < n+Size; i++) { if(sum < 0) { sum = arr[i]; } else { sum += arr[i]; } if(sum > maxSum) { maxSum = sum; } } return maxSum; } int seekmax(int*arr,int Size) { int m=arr[0]; int i=0; for( i = 0; i < Size; i++) { if(m<arr[i]) { m=arr[i]; } } return m; } int main() { int BreakRing(int *arr,int Size); int MSS; int i; int j=0; int n=0; int arr[N]={0}; char c;//用来判断何时停止输入的 printf("input N number: "); for(i=0;i<N;i++) { scanf("%d",&arr[i]); scanf("%c",&c); j++;//计数器 if(c==' ')//打入回车则自动结束 { break; } } printf("环数组: "); for(i=0;i<j;i++)//原数组打出屏幕 { printf("%d ",arr[i]); } printf(" "); MSS=BreakRing(arr,j); printf("结果: "); printf("Mss=%d ",MSS); return 0; } int BreakRing(int *arr,int Size) { int b[N]={0}; int i; int j=0; int Max; int k=0; int Max1[N]={0}; for(i=0;i<Size;i++) { b[i]=arr[i]; } for(i=Size;i<2*Size-1;i++) { b[i]=arr[j++]; } printf("打开: "); for(i=0;i<2*Size-1;i++)//数组打出屏幕 { printf("%d ",b[i]); } printf(" "); for(k=0;k<Size;k++) { Max1[k]=MaxSubSum(b,k,Size); } Max=seekmax(Max1,Size); return Max; }
运行截图:
解决思路:
老师课堂上已经讲过了一点思路,即把环数组拆开成一维数组。但为了保证可以从最后一个开始,经第一个进行循环,要对数组进行变形,将一个周期填充满,这样就保证了循环(如图所示)。
然后我构造了数组b,将展开的数组存入。
然后以size为步长,反复调用先前构造的MaxSubSum函数,得到一个序列,其中最大值即为所求。