【问题标题】:Dynamic Programming: Mission Per Day, Scheduling for Maximum Profit动态规划:每天的任务,最大化利润的调度
【发布时间】:2016-05-17 13:33:34
【问题描述】:

问题:

Bob 计划工作 n 天,每天i 有一个任务;每个任务只持续一天,必须在当天i 完成,并支付鲍勃x_i 美元。 Bob 一次不能连续执行超过 5 个任务。也就是说,他必须每 5 天至少休息 1 天。

Given 数字x_1...x_n,Bob 应该在哪几天执行任务,他应该在哪几天休息,以便尽可能多地赚钱而不工作超过 5 天?你的解决方案应该是O(n)

我的问题:

我在想出这个问题的重复出现时遇到了麻烦。这个问题我想了很久。我最初的想法是让p[i] = max{x_i + x_i-1 + .... + x_i-4}, where p[i] is the max profit earnable from days i-4 to i. 但是,我意识到,第一,这确实考虑到最佳解决方案可能有两个连续的工作日,第二,我没有建立以前的解决方案。

我的问题:谁能给我一些关于理解这个问题结构的见解?我觉得我只是不了解使解决方案易于查看的关键属性。

提前致谢!

【问题讨论】:

    标签: python algorithm dynamic-programming


    【解决方案1】:

    每天 i 您可以选择工作并将剩余工作日减少 1 并获利 x_i 或休息并将您的可用工作日重置为 5,在基本情况下,您处于第 0 天,有 5 个连续工作日可用.

    if (remaining_rest_days == 0) {
        MaximumProfit(current_day, 0, current_profit) = MaximumProfit(current_day+1, 5, current_profit)
    } else {
        MaximumProfit(current_day, remaining_rest_days, current_profit) = 
        max(
            MaximumProfit(current_day+1, remaining_rest_days - 1, current_profits + profit[current_day]),
            MaximumProfit(current_day+1, 5, current_profits)
        )
    }
    

    【讨论】:

      【解决方案2】:

      动态构建维度表6 x ntable[w_i][d_j] 条目将表示当 Bob 连续工作了最后 i 天(包括今天)并且这是第 j 天时的最大可达值。

      第一栏很容易填写: table[1][0] = x_0 如果 Bob 决定在第一天工作,所有其他值都是 0 (table[0][0] => Bob 在第一天不工作,table[2..5][0] => Bob 不能连续多天工作第 1 天。)

      按照以下规则逐列完成表格:

      j0 连续工作天数的最大值是前一天和今天不工作的任何值的最大值: table[0][d_j] = max{ table[0..5][d_j-1] }

      j1 连续工作天的最大值是前 2 天没有连续工作天加上 x_j 的最大值。 (休息超过 2 天是没有意义的,因为我们本来可以在这中间工作几天。):

      table[1][d_j] = max{ table[0][d_j-2], table[0][d_j-1] } + x[d_j]

      否则,table[w_i][d_j] = table[w_i-1][d_j-1] + x[d_j]

      解决方案将是最后一列中的最大值。

      【讨论】:

        【解决方案3】:

        我将公式定义如下:

        P(d,i):=在d天,你已经连续工作i天(包括d天),你能拿到的最高美金

        基本情况P(1,1) = x_1,其他为0, 那么答案是max(P(n,0), P(n,1)...P(n,5))

        公式是

        P(d,0) = max(P(d-1,0), P(d-1,1)...P(d-1,5))
        P(d,1) = P(d-1,0) + x_d
        P(d,2) = P(d-1,1) + x_d
        ...
        P(d,5) = P(d-1,4) + x_d
        

        显然可以用一个循环来完成,女巫是O(n)

        我对公式的推理是,对于P(d,i) where i>=1,这意味着您在d 天工作,并且由于您已经连续工作了i 天,之前的i-1 天您必须也在工作,因此公式P(d-1, i-1) + x_d

        对于P(d,0),表示你在d那天休息,也可以在前几天休息,但最多5天,否则一定不是最优解(有意义吗?),因此公式P(d,0) = max(P(d,i)) for i in [0,5]

        【讨论】:

          【解决方案4】:

          我真的很感谢这里发布的所有解决方案。我能够提出解决方案,所以我想我会发布它。请注意,此解决方案仅返回最大利润,而不是任何特定日期。

          Let P[i] = the maximum expected profit from day 1...i if Bob rests on day i

          Recurrence: P[i] = max{p[j] + x_j+1 + x_j+2 + ... + x_i-1, for i - 6 <= j < i 因此,我们希望 P[i] 是 bob 如果他在 i 休息时连续工作的最后五天的总和,加上他在最后一个休息日之前获得的利润@ 987654325@

          代码:

          def get_best_missions(x):
          
              n = len(x)
          
              p = [0 for i in range(n)]
          
              for i in range(1,n):
                  j = i - 6
          
                  if j < 0:
                      p[i] = sum(x[0:i])
                  else:
                      p[i] = max(p[i], p[j] + x[j+1] + x[j+2] + x[j+3] + x[j+4] + x[i - 1])
          
              return max(p)
          

          示例和结果

          x = [10, 10, 10, 5, 20, 10, 5]
          best = get_best_missions(x)
          
          p = [0, 10, 20, 30, 35, 55, 55]
          best = 55
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-14
            • 2015-02-05
            • 2013-02-25
            • 1970-01-01
            • 2012-11-12
            • 1970-01-01
            • 2014-02-08
            • 1970-01-01
            相关资源
            最近更新 更多