首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

如何给定数组连续区间数之和绝对值最大

2012-08-16 
怎么求一个给定数组连续区间数之和绝对值最大给定一个数组,含正负数,如何求连续区间数之和绝对值最大?[解

怎么求一个给定数组连续区间数之和绝对值最大
给定一个数组,含正负数,如何求连续区间数之和绝对值最大?

[解决办法]
找出连续的正数,或者连续的负数,相加,比较找出绝对值最大
[解决办法]
求连续区间和最大的。仅供参考。如果是绝对值的话,就需要稍微修改下了。

C/C++ code
#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;}
[解决办法]
C/C++ code
// 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;}
[解决办法]
搜 最大子段和 然后好好去看看动态规划.
[解决办法]
C/C++ code
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} 

热点排行
Bad Request.