我的K-Dane算法实现有什么问题?

时间:2014-12-15 13:21:42

标签: c algorithm dynamic-programming

对于HackerRank挑战The Maximum Subarray,我们也应该为负数实现K_Dane算法。

下面是我的C实现,我试图弄清楚如何调试它,但是没有成功这样做,有人能帮我弄清楚代码中的错误吗?

#include <stdio.h>

int main(void)
{
    long long int t, n;
    scanf("%lld", &t);
    while(t--)
    {
        scanf("%lld", &n);
        long long int numbers[n], i;
        for(i = 0;i < n;i++)
        {
            scanf("%lld", &numbers[i]);
        }
        long long int contigoussum = numbers[0],crtsum = numbers[0], sum = numbers[0];
        for(i = 1;i < n;i++)
        {
            if(numbers[i] + sum > sum)
            {
                sum += numbers[i];
            }

            crtsum += numbers[i];
            if(crtsum > contigoussum)
            {
                contigoussum = crtsum;
            }
            else
                crtsum = 0;
        }

        printf("%lld %lld\n", contigoussum, sum);
    }
    return 0;
}

尽管如此,我并不知道所有测试用例代码都无法正常工作,但我想出了一个:

输入

1
6
2 -1 2 3 4 -5

输出

7 11

真实答案:我认为它是10 11,因为最大的连续总和可能是[2 -1 2 3 4]

2 个答案:

答案 0 :(得分:2)

因为这个:

else
   crtsum = 0;

将其更改为:

else if(crtsum <0)
    crtsum = 0;

here是您工作代码的在线版本。

答案 1 :(得分:1)

对于所有负数组

,接受的答案都失败了
void calc(vector<int>& ar){
    int contigoussum = 0,crtsum = 0, sum = 0;
    int positive=0;
    int max=ar[0];

    for(int i = 0;i < ar.size();i++)
    {
        if(ar[i]>0)
            positive =1;
        else if (ar[i]>max)
            max=ar[i];
        if(ar[i] + sum > sum)
        {
            sum += ar[i];
        }

        crtsum += ar[i];
        if(crtsum > contigoussum)
        {
            contigoussum = crtsum;
        }
        else if(crtsum <0)
            crtsum = 0;
    }
    if(positive)
        cout<< contigoussum<<" "<<sum<<endl;
    else
        cout<< max<<" "<<max<<endl;             
}