动态规划 - 窃贼变异问题
-
29-09-2020 - |
题
说你是一个小偷,你是一排的房子,你应该罗布:
$$ 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)$ 使用上述公式总体时间。