SPOJ 拒绝 BYTESM2(魔法石)的解决方案

Posted

技术标签:

【中文标题】SPOJ 拒绝 BYTESM2(魔法石)的解决方案【英文标题】:SPOJ rejects solution to BYTESM2 (Philosopher's stone) 【发布时间】:2016-01-26 16:20:12 【问题描述】:

我为 Page on SPOJ 上的 BYTESM2 问题编写了此解决方案。 法官不断为我的代码抛出 WA(错误答案),我似乎无法弄清楚出了什么问题。 问题 cmets 建议将 coutprintf 交换,但这不会改变任何事情。

#include <iostream>

using namespace std;

int Memo[100][100];

void RefreshMemo()

    for (int i = 0; i < 100; ++i)
        for (int j = 0; j < 100; ++j)
            Memo[i][j] = -1;


inline int Max(int a, int b, int c = -1)

    if( a > b && a > c)
        return a;
    else if( b > a && b > c)
        return b;
    return c;


int CollectMax(int Stones[100][100], int i, int j, int MaxRow, int MaxColumn)

    if (Memo[i][j] > 0)
        return Memo[i][j];

    else
    
        if (i == MaxRow)
            Memo[i][j] = Stones[i][j];
        else if (j == 0)
            Memo[i][j] = Stones[i][j] + Max( CollectMax(Stones, i+1, j, MaxRow, MaxColumn), CollectMax(Stones, i+1, j+1, MaxRow, MaxColumn) );
        else if (j == MaxColumn)
            Memo[i][j] = Stones[i][j] + Max( CollectMax(Stones, i+1, j, MaxRow, MaxColumn), CollectMax(Stones, i+1, j-1, MaxRow, MaxColumn) );  
        else
            Memo[i][j] = Stones[i][j] + Max( CollectMax(Stones, i+1, j, MaxRow, MaxColumn), CollectMax(Stones, i+1, j+1, MaxRow, MaxColumn), CollectMax(Stones, i+1, j-1, MaxRow, MaxColumn) );

        return Memo[i][j];
    


int main()

    int t;
    cin>>t;
    while ( t-- && t >= 0)
    
        int Stones[100][100], h, w;
        int Answer = 0;
        cin>>h>>w;

        for (int i = 0; i < h; ++i)
            for (int j = 0; j < w; ++j)
                cin>>Stones[i][j];
        RefreshMemo();  
        for (int i = 0; i < w; ++i)
        
            int TryI = CollectMax(Stones, 0, i, h-1, w-1);
            if(Answer < TryI)
                Answer = TryI;
        
        cout<<Answer<<endl;
    
    return 0;

【问题讨论】:

用scanf改cout只会提高执行速度,不会提高问题的正确性 没错,它确实将执行时间加快了 2.5 倍,但仍然会引发 WA 响应。 如果只有一列会怎样? (我的意思是你的代码将如何表现) @PranavAnurag 我们不知道 SPOJ 引擎的内部工作原理。因此,您的问题只是无法回答,抱歉。 我的代码在所有其他方面看起来都正确吗,@πάνταῥεῖ? 【参考方案1】:

当某些单元格不包含任何石头时,您的解决方案无法处理。例如,考虑输入:

1 2 2 0 0 1 1

这种情况的答案应该是 1,而您的代码返回 0。

【讨论】:

以上是关于SPOJ 拒绝 BYTESM2(魔法石)的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

分治魔法石的诱惑

魔法石之恋

问题 G: Heartlessly 的魔法石

魔法石的诱惑

我的动态编程方法哪里出错了?

动态规划机器分配