【发布时间】: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 引擎的内部工作原理。因此,您的问题只是无法回答,抱歉。
-
我的代码在所有其他方面看起来都正确吗,@πάνταῥεῖ?
标签: c++ algorithm dynamic-programming