Algorithm 动态规划-书架的最大布局

Algorithm 动态规划-书架的最大布局,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我试图解决一个问题,所以我不是在寻找代码,而是寻找类似的算法,这样我就可以自己解决它 我得到了n书架,每个书架都有大小数量的书。我将把其中一些书架搬到一个新房间,如下所示: 第一个书架将始终被移动 我将保留新房间中书架的顺序(我不能在新房间中更改位置,一旦我选择了书架6,我就不能从0到5中选择任何一本书) 书架i不能放在任何一个书架i-1或i+1旁边(例如:我不能放?-4-5-?/?-5-6-?/?-4-5-6-?) 哪种配置的书架能为我提供最多的书 我知道这是用动态规划算法解决的,但我不确

我试图解决一个问题,所以我不是在寻找代码,而是寻找类似的算法,这样我就可以自己解决它

我得到了
n
书架,每个书架都有
大小
数量的书。我将把其中一些书架搬到一个新房间,如下所示:

  • 第一个书架将始终被移动
  • 我将保留新房间中书架的顺序(我不能在新房间中更改位置,一旦我选择了书架
    6
    ,我就不能从
    0到5
    中选择任何一本书)
  • 书架
    i
    不能放在任何一个书架
    i-1
    i+1
    旁边(例如:我不能放?-4-5-?/?-5-6-?/?-4-5-6-?)
哪种配置的书架能为我提供最多的书

我知道这是用动态规划算法解决的,但我不确定是哪一种。我最初认为这类似于背包问题,但我没有书的限制,所以它明显不同(至少我认为是这样)


非常感谢您的任何建议

制作一个数组
int M[n]
,并设置
M[0]=b[0]
,因为第一个书架总是被移动的。然后进行如下操作:

  • 对于每个元素
    b[i]
    ,其中
    i>0
    ,设置
    M[i]=b[i]
  • 0
    i-2
    范围内的
    M
    索引
    j
    处遍历
    M
    元素;从
    i-2开始
    ,因为你不能拿
    b[i]
  • M[i]
    设置为当前
    M[i]
    M[j]+b[i]
    的最大值。这句话的意思是“我拿着
    b[I]
    ,把它放在以
    j
    结尾的一系列书架上。”
  • 循环结束后,遍历
    M[]
    ,找到最高的元素。这是你的答案
  • 要打印书架索引的顺序,请从
    M[]
    (例如,
    p
    )的最大元素位置开始,然后打印
    p
  • 现在通过
    M
    查看位置
    k
    ,以便
    M[k]=M[p]-b[p]
    。由于数组
    M[]
    的构造方式,至少会有一个这样的元素
  • 打印
    k
    ,设置
    p=k
    ,然后继续,直到到达数组的开头

你好,Xzenon。Progammers:或CS:可能是获得算法想法的更好选择。我很确定这个问题没有明确说明。唯一的限制是你不能把某些书架挨着放?你有一些样本数据吗?我认为没有必要使用动态规划…请看我的答案