怎么求一个给定数组连续区间数之和绝对值最大
给定一个数组,含正负数,如何求连续区间数之和绝对值最大?
[解决办法]
找出连续的正数,或者连续的负数,相加,比较找出绝对值最大
[解决办法]
求连续区间和最大的。仅供参考。如果是绝对值的话,就需要稍微修改下了。
#include <stdio.h>#define NUM 1001int main(){ int nArr,nSum[NUM]; int nCase; int N,i,j=0; int nStart ,nEnd,nMaxSum; scanf("%d",&nCase); while(j<nCase) { j++; scanf("%d",&N); scanf("%d",&nArr); nSum[0] = nArr; nStart = 1; nEnd = 1; nMaxSum = nSum[0]; for (i=1;i<N;i++) { scanf("%d",&nArr); if (nSum[i-1]>=0) { nSum[i] =nSum[i-1]+nArr; } else { nSum[i] = nArr; } if (nSum[i]>=nMaxSum) { nMaxSum = nSum[i]; nEnd = i+1; } } if (nMaxSum>=0) { int nTmp = nMaxSum; for (i=nEnd-1;i>=0;i--) { if (nSum[i]<0) { break; } } if (i>=0) { nStart = i+2; } else { nStart = 1; } } else { nStart = nEnd; } printf("Case %d:\n",j); printf("%d %d %d\n",nMaxSum,nStart,nEnd); if(j!=nCase) printf("\n"); } return 0;}
[解决办法]
// Return maximal sub-summary, which is at a[start, end].int max_sub_sum(int *a, int len, int* start, int* end) { assert(len > 0); assert(a && start && end); int sum = a[0]; int max_sum = sum; int s = 0; int e = 0; *start = s; *end = e; for(int i = 1; i < len; ++i) { if (sum < 0) { sum = a[i]; s = i; e = i; } else { sum += a[i]; } if(sum > max_sum) { max_sum = sum; e = i; *start = s; *end = e; } } return max_sum;}
[解决办法]
搜 最大子段和 然后好好去看看动态规划.
[解决办法]
intMaxSubsequenceAbsSum(const int A[], int N){ int tmpMinusSum = 0, tmpPosSum = 0; int maxMinusSum = 0, maxPosSum = 0; for (int i = 0; i < N; i++) { tmpMinusSum += A[i]; if (tmpMinusSum < maxMinusSum) maxMinusSum = tmpMinusSum; else if (tmpMinusSum > 0) tmpMinusSum = 0; tmpPosSum += A[i]; if (tmpPosSum > maxPosSum) maxPosSum = tmpPosSum; else if (tmpPosSum < 0) tmpPosSum = 0; } return -maxMinusSum > maxPosSum ? -maxMinusSum : maxPosSum}