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 建议将 cout
与 printf
交换,但这不会改变任何事情。
#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(魔法石)的解决方案的主要内容,如果未能解决你的问题,请参考以下文章