如何实现dp?

时间:2015-12-11 19:31:07

标签: algorithm optimization dynamic-programming combinatorics

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

编辑:
实际上有一个矩阵(如教室),其中三种类型(L R B)的人可以坐着而不会碰到手。我必须生成可以就座的最多人数。假设我有一个2x2矩阵并用左,右和双手类型的人填充它L = 0,R = 1,B = 3。因此,一个有效的安排是Row0:B R和row1:B -,其中-表示空白座位。

1 个答案:

答案 0 :(得分: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]

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

相关问题