有限长度树中的最大子树总和
Max subtree sum in tree with limited length
我有一个树结构。
任务是找到最大的sum/weight个路径节点,但是我只能移动n次。没关系,但是 "up"/"back" 不需要任何费用。
我怎样才能做到这一点?
下面是我的代码,但问题是每个节点只能访问一次,所以它不起作用。
int mSum(Node* node, int mvLeft) {
if (node == nullptr) { return 0; }
if (mvLeft == 0) { return node->value; }
mvLeft--;
int sum = max(mSum(node->left, mvLeft), mSum(node->right, mvLeft));
return node->value + max(sum, mSum(node->parent, mvLeft + 1));
}
这是示例图。节点上的数字代表到达它的成本。除了"back".
,每个节点只能被访问一次
这里的 n 步限制是 3,我们也计算进入图形,所以正确的结果是 21,因为:2->8->11.
如果我们有 4 步的限制,结果将是 31:2->10->8->11
我的朋友试图用 DFS 来做,他说的对吗?最好的算法是什么?
好的答案是同时走多条路线。
我的意思是我们可以使用 2 长度限制:
- 2 左 0 右
- 1 左 1 右
- 0 左 2 右
工作,但有点慢,代码:)
它的工作时间是 28 秒,而其他解决方案可以用 2 秒(10 个未知测试)
int mSum(Node* node, int mvLeft) {
mvLeft--;
if (mvLeft < 0) {
return 0;
}
else if (mvLeft == 0) {
return node->value;
}
if (node->left != nullptr && node->right != nullptr) {
int max = 0;
for (int i = 0; i <= mvLeft; i++) {
max = Max(max, mSum(node->left, i) + mSum(node->right, mvLeft - i));
}
return max + node->value;
}
else if (node->left != nullptr) {
return mSum(node->left, mvLeft) + node->value;
}
else if (node->right != nullptr) {
return mSum(node->right, mvLeft) + node->value;
}
return node->value;
}
我有一个树结构。 任务是找到最大的sum/weight个路径节点,但是我只能移动n次。没关系,但是 "up"/"back" 不需要任何费用。 我怎样才能做到这一点?
下面是我的代码,但问题是每个节点只能访问一次,所以它不起作用。
int mSum(Node* node, int mvLeft) {
if (node == nullptr) { return 0; }
if (mvLeft == 0) { return node->value; }
mvLeft--;
int sum = max(mSum(node->left, mvLeft), mSum(node->right, mvLeft));
return node->value + max(sum, mSum(node->parent, mvLeft + 1));
}
这是示例图。节点上的数字代表到达它的成本。除了"back".
,每个节点只能被访问一次
这里的 n 步限制是 3,我们也计算进入图形,所以正确的结果是 21,因为:2->8->11.
如果我们有 4 步的限制,结果将是 31:2->10->8->11
我的朋友试图用 DFS 来做,他说的对吗?最好的算法是什么?
好的答案是同时走多条路线。 我的意思是我们可以使用 2 长度限制:
- 2 左 0 右
- 1 左 1 右
- 0 左 2 右
工作,但有点慢,代码:) 它的工作时间是 28 秒,而其他解决方案可以用 2 秒(10 个未知测试)
int mSum(Node* node, int mvLeft) {
mvLeft--;
if (mvLeft < 0) {
return 0;
}
else if (mvLeft == 0) {
return node->value;
}
if (node->left != nullptr && node->right != nullptr) {
int max = 0;
for (int i = 0; i <= mvLeft; i++) {
max = Max(max, mSum(node->left, i) + mSum(node->right, mvLeft - i));
}
return max + node->value;
}
else if (node->left != nullptr) {
return mSum(node->left, mvLeft) + node->value;
}
else if (node->right != nullptr) {
return mSum(node->right, mvLeft) + node->value;
}
return node->value;
}