以下为 C++
代码
#include <cstdio>
const int MN = 30;
int edge[MN][MN], next[MN], dp[MN];
int main() {
int n, status, maxi = 0, maxj, maxn, begin;
scanf("%d", &n);
for (register int i = 1; i <= n; ++ i) {
scanf("%d", dp + i);
}
for (register int i = 1; i <= n; ++ i) {
for (register int j = i + 1; j <= n; ++ j) {
scanf("%d", &status);
if (status)
edge[i][++ edge[i][0]] = j;
}
}
for (register int i = n; i > 0; -- i) {
maxn = 0;
for (register int j = edge[i][0]; j > 0; -- j) {
if (maxn < dp[edge[i][j]] + dp[i]) {
maxn = dp[edge[i][j]] + dp[i];
maxj = j;
next[i] = edge[i][j];
}
}
if (dp[i] < maxn)
dp[i] = maxn;
if (dp[begin] < dp[i])
begin = i;
}
for (register int i = begin; i > 0; i = next[i])
printf("%d ", i);
printf("\n%d", dp[begin]);
return 0;
}
我用深度优先搜索 AC 了一遍,想要用动态规划再做一次(即如上代码)。我在自己的机器上可以过,但是提交测评却 RE 了,请问我哪里做错了?如果方便,请指出我的错误,感激不尽!
变量说明:
我使用了 edge[i][j]
存图,其中 edge[i][0]
表示与 i 连通的地窖的数目,而对于 j>0 时, edge[i][j]
储存的是与 i 相连的第 j 个地窖的编号。
next[i]
数组表示从 i 开始挖地雷时,若想让总数最大,则需要前往第 next[i] 号地窖。