我遇到了一个动态的编程问题,这是小偷的一个变体。

说你是一个小偷,你是一排的房子,你应该罗布:

$$ house_1,house_2 \ dots house_n $$

与每个房屋有以下值: $$(x_i \ geqy_i \ geq z_i \ gt0)$$

你的利润 x 如果你抢劫房子但没有相邻的房屋。

你的利润 y 如果你抢劫房子和恰好是相邻的房屋。

你的利润 z 如果你抢劫房屋和两个相邻的房屋。

房屋A-B-C的案例是:

$$利润(001)= 0 + 0 + C_X $$ $$利润(101)= A_X + 0 + C_X $$ $$利润(110)= a_y + b_y + 0 $$ $$ profit(111)= a_y + b_z + c_y $$

1代表抢劫房屋,0用于抢劫房屋

显然,您无法利用第一个和最后一个房屋的 z 值,并且每组值都是随机的。

现在问题是:你应该抢劫哪个房子以获得最大利润?

我的主要问题是我无法为这个问题建立基本情况。

起初我想创建一个 n * m阵列,m是我可以从0-n的最大房子的最大房屋,当每个房子都没有抢劫并思考:抢劫它 - 唐't rob et但没有什么。

任何尖端或方向将得到理解。

提前感谢。

有帮助吗?

解决方案

对于 $ i= 1,\ dots,n $ ,以及 $ r \ in \ {s,r, B \} $ define $ opt [i,r] $ as 通过抢劫第一个 $ i $ 的合适子集可以获得的最大利润,其中包含以下约束:

  • 如果 $ x= s $ (如 s kip)那么house $ i $ 不得抢劫。
  • 如果 $ x= r $ 然后house $ i $ 必须是 r house $ i + 1 $ 将不会被抢劫(以避免案例区分,我们假装House $即使 $ i= n $ ),也存在+ 1 $ 即使是存在。
  • 如果 $ x= b $ 那么 b 其他房子 $ i $ 和房子 $ i + 1 $ 需要被抢夺。

对于 $ i= 1 $ 您有 $ opt [1,s]= 0 $ $ opt [1,r]= x_1 $ $ opt [1,b]= y_1 $

对于 $ i> 1 $ 您有: $$ opt [i,s]=max \ {opt [i-1,s],opt [i-1,r] \}, $$ $$ 选择[i,r]=max \ {x_i + opt [i-1,s],y_i + opt [i-1,b] \}, $$ $$ opt [i,b]=max \ {y_i + opt [i-1,s],z_i + opt [i-1,b] \}。 $$

最佳利润是: $ \ max \ {opt [n,s],opt [n,r] \} $ ,可以在中计算$ O(n)$ 使用上述公式总体时间。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top