【问题标题】:How to implement dp?如何实现dp?
【发布时间】:2016-03-17 19:35:03
【问题描述】:

我最近遇到一个问题,我被赋予了两种类型的人:左撇子和右撇子(写作风格)。他们都必须排成一排,为了避免任何干扰,他们的手不得碰撞,即图案可能像 LR 或 LL 或 RR。
我尝试使用递归(每个座位采用 L 和 R 的两个分支),但即使对于 100 行大小,计算数量也会非常高。 不知何故,我需要实现 DP 来减少计算。请建议。

编辑:
实际上有一个矩阵(就像一个教室),其中三种类型(L R B)的人可以在没有手碰撞的情况下就座。我必须生成可以坐下的最大人数。假设我有一个 2x2 矩阵,并用左手、右手和双手类型的人 L=0、R=1、B =3 来填充它。因此,一种有效的安排是第 0 行:B R 和第 1 行:B -,其中- 表示空白座位。

【问题讨论】:

  • 那个问题问的是什么问题?您只说明了限制条件。如果您只想要一些有效的座位,只需将所有左撇子都放在左边。
  • 问题需要在给定 L 和 R 的情况下容纳最大可能的人数。如果我们有同时使用双手的人会发生什么?
  • “双手”没有出现在你的问题中,我仍然认为将所有左撇子放在左边,把右手放在右边没有问题。没有什么可优化的,它会填满整排或让所有人坐下,以先到者为准。
  • 我已经编辑了这个问题。我试图填写这个矩阵。
  • 好吧,现在看起来更像是一个实际问题了。

标签: algorithm optimization dynamic-programming combinatorics


【解决方案1】:

实际上,您拥有一个矩阵这一事实并没有对解决方案产生影响,您可以将其转换为一个数组而不会失去一般性,因为每个状态都取决于它的左或右而不是它的上下。自下而上的方法:在每个州,你有三个东西 LBR,你想要填补的座位的索引和左边的人。现在我们可以从右到左填充表格。答案是dp[inedx=0][L][B][R][left_person=' ']

recursive [index][L][B][R][left_person] :
  if left_person = ' ' or 'L':
    LVal = recursive[index+1][L-1][B][R]['L']
  if left_person = ' ' or 'L' or 'R'
    RVal = recursive[index+1][L][B][R-1]['R']
  if left_person = ' ' or 'L':
    BVal = recursive[index+1][L][B-1][R]['B']
  NVal = recursive[index+1][L][B][R][' ']
  max(LVal, RVal, BVal, NVal) -> dp[index][L][B][R][left_person]

当然这并不完整,我只是给你一个大致的想法。您应该添加一些细节,例如基本案例,并在分配之前检查是否还有这种人以及其他一些细节。

【讨论】:

  • 感谢您的帮助.. 这是我承诺的全部递归代码 [ideone.com/caI01Z] 但它的计算量很大,我的时间限制是 1 秒 n=100 m=100。所以它肯定我必须使用更多的优化来传递它......
  • 问题根源在哪里?
  • 1 ≤ N, M ≤ 10^8; 0 ≤ Z, L, R, B ≤ 10^16 的实用性如何? (见问题链接,codechef.com/DEC15/problems/CHCINEMA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
相关资源
最近更新 更多