在比赛编程中,我经常被建议分配超过零维数据类型所需的空间,即阵列或数组阵列,而不是任务限制所需的空间。
E.g。对于简单的DP任务,计算最大值的总和时,从顶部到底部选择整数值的三角形中的路径,最大高度为100(参见下面的示例),我建议为110行分配空间。
我被给予的原因:万一它需要更多空间,它不会崩溃。
但是,我没有看到这背后的逻辑。如果一个程序试图使用这个数组的更多空间,至少在我看来,它必须包含一些bug。在这种情况下, not 会更有意义地分配更多空间,因此会注意到错误,而不是让程序有空间去做它本不该做的事情。
所以我希望有人可以给我一个解释,说明为什么会这样做,在哪些情况下这实际上是有用的。
上述任务示例(右下角):
无需额外分配:额外分配:
1 0 0 0 1 0 0 0 0 0
2 3 0 0 2 3 0 0 0 0
4 5 6 0 4 5 6 0 0 0
7 8 9 5 7 6 9 5 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
在此示例中,具有最大值的路径sum将是右 - 右 - 左,总和为1 + 3 + 6 + 9 = 19
解决问题的示例C ++实现(无需额外分配即可完美运行):
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> p(100, vector<int>(100));
vector<vector<int>> dp(100, vector<int>(100, -1));
int n = 0;
int maxsum(int r, int c) {
if (r == n-1) {
dp[r][c] = p[r][c];
} else {
if (dp[r][c] == -1) {
dp[r][c] = max(maxsum(r+1, c), maxsum(r+1, c+1)) + p[r][c];
}
}
return dp[r][c];
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j <= i; j++) {
cin >> p[i][j];
}
}
cout << maxsum(0, 0) << "\n";
return 0;
}
答案 0 :(得分:1)
你得到的答案是完全合法的。
我的简短回答:这只是一种面向未来的技术。比抱歉更安全。此外,现在存储不是一个问题。在软盘时代,这可能是一个更大的问题。
我看到它的方式,如果我可以使我的代码更加面向未来并且不太可能以允许它在行和列的零上浪费几千字节而崩溃,那么就这样吧。这是一个很小的代价来支付应急费用。 :)
答案 1 :(得分:0)
如果你考虑失败快速发展的策略,你是对的。