gpt4 book ai didi

c - 采访中询问: Dynamic Programming

转载 作者:行者123 更新时间:2023-11-30 21:38:05 25 4
gpt4 key购买 nike

“N”枚炸弹排成一排。每颗炸弹都有一个与之对应的“索引”。假设第 i 个位置炸弹的索引为 k。意思是当第i颗炸弹扩散时,它与其左边的k颗炸弹一起扩散,右边的k颗炸弹也一起扩散。输入的第一行包含数字 N(炸弹数量),下一行包含空格分隔的炸弹索引(k)。将输出打印为此类炸弹的最小数量,该炸弹在扩散时会扩散所有其他炸弹,后跟炸弹索引。如果有多个这样的索引组合,请将它们打印在单独的行上。

例如

输入:

8

1 2 7 3 4 9 3 4

输出

1

9

输入:

20

1 1 1 9 1 1 1 1 1 4 1 1 1 1 1 8 1 1 1 1

输出

2

9 8

最佳答案

让:

dp[i] = minimum number of bombs that need to be defused in order to defuse
all bombs in [1, i] considering only bombs in [1, i]

我们有:

dp[anything<=0] = 0
dp[1] = 1 <- must defuse the first bomb
dp[k] = min{dp[k - a[k]] + overlap, <- if the current bomb also defuses
a[k] to its left and right, then we can just
defuse that and reduce the problem
to defusing bombs [1, k - a[k]]
dp[k - a[k] + 1] + overlap, <- same reasoning; some overlaps might provide
a better solution
dp[k - a[k] + 2] + overlap,
...
dp[k - 1] + overlap}

哪里overlap1如果炸弹位于p = k - a[k] + i也不能化解k第一枚炸弹和0否则。

答案是dp[n] 。直接实现是O(n^2) 。也许可以使其呈线性。

工作示例:

a = 1 2 7 3 4 9 3 4
dp[1] = 1
dp[2] = min{dp[2 - 2] + 1,
dp[2 - 1] + 0 (because the first bomb also defuses this one}
= 1
dp[3] = min{dp[3 - 7] + 1,
dp[3 - 2] + 1 (because the first bomb does not also defuse this one),
dp[3 - 1] + 0}
= 1
...

关于c - 采访中询问: Dynamic Programming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20021540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com