【问题标题】:What's wrong with my K-Dane algorithm implementation?我的 K-Dane 算法实现有什么问题?
【发布时间】:2014-12-15 13:21:41
【问题描述】:

对于 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]

【问题讨论】:

  • 哪里错了?为您的问题添加输入、预期输出和计算输出。您是否尝试过使用调试器跟踪一个小示例?
  • 嗯,我真的不知道... HackerRank 并没有告诉我哪些测试用例是错误的,以及测试用例是什么... @MrSmith42
  • 所以您的代码通过了您用于测试的所有示例?
  • @MrSmith42 我添加了一个测试用例,但我的代码无法正常工作...

标签: c algorithm dynamic-programming


【解决方案1】:

因为这个:

else
   crtsum = 0;

改成这样:

else if(crtsum <0)
    crtsum = 0;

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

【讨论】:

  • 太好了。这适用于那个测试用例,但我不知道为什么,但我的代码仍然没有通过一个测试用例,而我没有......
  • @Nib 我真的不知道,这不是我的比赛,这可能是你的大数字问题......除此之外,我刚刚检查了你的个人资料,发现你很少接受答案,在这里和我。这不是一个好方法。
  • 如果我的问题没有得到解答,那么我不接受答案...@AliAmiri
  • @Nib 这是你的答案,但如果你想让像我这样的人为你参加比赛,情况就不同了。但正如我的语言中所说的“国王知道什么对他们更好”:)
【解决方案2】:

所有否定数组的接受答案都失败

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;             
}

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 2021-10-21
    • 2019-06-07
    • 2021-07-25
    • 2011-09-08
    • 2016-05-28
    相关资源
    最近更新 更多