【问题标题】:Finding a recursive formula for dynamic programming problem寻找动态规划问题的递归公式
【发布时间】:2019-12-03 23:36:55
【问题描述】:

我遇到了一个应该使用动态编程的问题,但我真的被卡住了。我真的很想了解如何解决这个问题。

问题如下:给定一个大小为 N 的数组,每个条目代表一个具有给定值的城市。在每一轮,你必须选择在哪里建造一堵墙。 “敌人”然后选择从哪一方(东或西)进攻,摧毁所有的城市,直到墙。您只从仍然存在的城市收集价值。敌人以最佳方式摧毁城市,这意味着它总是会最小化你在游戏结束时可以获得的价值(不是每轮最小化,贪婪地)。

一个简单的例子:

数组:8、6、2、4、2

第一轮 - 最好的选择是在价值 6 和价值 2 的城市之间建造。敌人从西面进攻,收集价值 8。

第二轮 - 最好的选择是在价值 2 和价值 4 的城市之间建造。敌人从东面进攻,收集价值 2。

此游戏的总价值为 10。

我正在寻找一个递归公式来计算我在每场比赛中可以获得的最大可能值。我想用这个递归公式来创建一个动态编程算法。任何帮助将不胜感激。

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    这是一个似乎适用于您提供的示例的想法。虽然没有更多的测试来确认,它可能并不完全可靠,但它可以帮助你思考它。请查看代码中的 cmets。 (前两个函数是为了帮助有效地计算子数组和。)

    function getPrefixSums(A){
      var ps = new Array(A.length + 1).fill(0)
      for (let i=0; i<A.length; i++)
        ps[i+1] = A[i] + ps[i]
      return ps
    }
    
    function getSum(ps, l, r){
      return ps[r+1] - ps[l]
    }
    
    function f(A, ps, l, r){
      // No moves available 
      if (l == r)
        return 0
      // One choice to place wall
      if (l + 1 == r)
        return Math.min(A[l], A[r])
        
      // For each of our available choices,
      // the enemey will choose the side
      // that guaratees we get the least.
      // Choose the BEST of these.
      let goodForUs = -Infinity
    
      for (let i=l+1; i<=r; i++){
        let west = getSum(ps, i, r) + f(A, ps, i, r)
        let east = getSum(ps, l, i-1) + f(A, ps, l, i-1)
    
        if (east > west){
          // Enemy chose west
          if (west > goodForUs)
            goodForUs = west
          
        // Enemy chose east
        } else if (east > goodForUs){
          goodForUs = east
        }
      }
      
      return goodForUs
    }
    
    var A = [8, 6, 2, 4, 2]
    var ps = getPrefixSums(A)
    
    console.log(f(A, ps, 0, A.length-1))

    【讨论】:

      猜你喜欢
      • 2012-07-10
      • 2021-06-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 2013-11-14
      相关资源
      最近更新 更多