【问题标题】:At most k adjacent 1s (Maximum Value limited neighbors)最多k个相邻的1s(最大值有限的邻居)
【发布时间】:2015-08-29 16:43:19
【问题描述】:

在我的算法课程中,书中有一个问题如下:“给定一个由正数组成的数组 a[1..n] 和一个整数 k。你必须产生一个数组 b[1. .n],使得:对于每个 j,b[j] 要么为 1,要么为 0。数组 b 最多有 K 次相邻的 1。Sum(a[j]*b[j]) for 1

解决方案使用动态规划,在与一些朋友讨论时,他们说递归关系的形式为 M(i, j) = max(M(i-2, j) + a[i], M(i- 1, j-1) + a[i])

有人可以解释为什么会这样吗?或者他们是否有解决此类问题的不同形式。我发现动态编程有点难以掌握。 谢谢你。

【问题讨论】:

    标签: arrays algorithm dynamic dynamic-programming


    【解决方案1】:

    M[i, j] 是从1到i的最大和,其中j相邻1s

    M[i,j] 可以计算为 3 种情况的最大值:

    b[i]=0  =>  S=M[i-1, j]   // a[i] not added to sum, b[1..i-1] has same number of adjacent 1s (j) as b[1..i] because b[i] is zero
    
    b[i]=1 and b[i-1]=0  => S=M[i-2, j]+a[i]   // a[i] added to sum, b[1..i-2] has same number of adjacencent 1s, because b[i-1] is zero
    
    b[i]=1 and b[i-1]=1  => S=M[i-1, j-1]+a[i]   // a[i] added to sum, since b[i] and b[i-1] are both 1, they count as adjacent 1s, so b[1..i-1] contains only j-1 adjacent 1s
    

    递归规则是上述 3 个和的最大值。 结束条件是 M[1, j]=a[1] 因为 b[1..1] 只有一项 b[1]=1 并且没有相邻的 1。

    我们需要的答案是 M[n, k]。

    复杂度为 O(nk)。

    【讨论】:

    • 注意!!!! Juan Lopez 上面的回答是错误的 - 尝试运行 print solve([100,100,1,100],1) 你会得到 [0, 1, 0, 1] 而不是 [1,1,0,1] 。为什么在我已经发布正确答案之后发布错误答案?建议先阅读现有答案。附言大写用于类型和类,而不是变量!这是一个普遍接受的惯例。
    • 不,不是。 solve([100,100,1,100],1) 表示相邻的“1”不能超过 1 个。所以 [1, 1, 0, 1] 不是一个有效的答案。我发布我的答案正是因为我认为你的答案不正确。另外,不要因为你先发帖就骚扰其他发帖者。
    • print solve([10, 100, 300, 400, 50, 4500, 200, 30, 90], 2) 输出 [1, 0, 1, 1, 0, 1, 1, 0 , 1] 其中包含两个相邻的对!同样 [1,1,0,1] 恰好有 1 个相邻对,这正是我所要求的。
    • 我认为这不是问题真正要问的。我们需要更多的 OP 示例来确定。或者只是让OP决定。但是,如果您不同意,则无法编辑其他人的答案。请注意,我什至没有否决您的回答。
    • 那么您自己的代码会为原始示例返回 [1,0,1,1,0,1,1,0,1],这是正确的,因为它包含两个相邻的连续 1 对。只是你的代码对 arr=[100,100,1,100] 和 k=2 给出了错误的答案,因为它忽略了 M[i-2, j]+a[i] 的递归情况。
    猜你喜欢
    • 2019-06-05
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2016-09-10
    • 2018-01-06
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多