我试图解决一个问题,所以我不是在寻找代码,而是寻找类似的算法,这样我就可以自己解决它。
我有n书架,每个书架里面都有size本书我要把这些书架搬到一个新房间,如下所示:
第一个书架总是会被移动的;
我会保持新房间书架的顺序(我不能改变新房间的位置,一旦我选择了书架6,我就不能从0 to 5中选择任何一本书);
书架i不能放在i-1i+1书架旁边(例如:我不能放?-4-5-?/是吗?-5-6-?/是吗?-4-5-6-?)(二)
哪种书架的配置能给我提供最多的书?
我知道这是用动态规划算法解决的,但我不确定是哪一个。我最初以为它会类似于背包问题,但我没有书籍的限制,所以它明显不同(至少我认为是这样)。
任何建议都非常感谢!

最佳答案

创建一个数组int M[n],并设置M[0] = b[0],因为第一个书架总是移动的然后按以下步骤进行:
对于每个元素b[i],其中i > 0,设置M[i] = b[i]
在索引M处浏览j的元素,范围从0i-2,包括;从i-2开始,因为您不能使用b[i]之前的书架
M[i]设置为最大电流M[i]M[j] + b[i]。这个表达式的意思是“我把它附加到以b[i]结尾的一系列书架上。”
循环结束后,遍历j,并找到最高的元素这是你的答案。
要打印书架索引序列,请从M[]的max元素(例如M[])开始,然后打印p
现在回顾一下p的位置,这样M。由于数组的构造方式,将至少有一个这样的元素。
打印k < p,设置M[k] = M[p] - b[p],然后继续,直到到达数组的开头。

10-08 00:37