题目
有一个环形的小区,每家有一定的金额,使用nums[]数组表示,小偷进了小区进行偷取。
小偷偷了一家后,与这家相邻的家就不能再偷了,请问小偷能偷取的最大金额是多少?
思路
若小区只是一排,那题目就简单了,简单dp即可。
dp[i][0] 表示不偷取第i家,在前i家中可偷取的最大金额
dp[i][1] 表示偷取第i家,在前i家中可偷取的最大金额
那么可得:
dp[i][0] = max(dp[i-1][0], dp[i-1[1])
dp[i][1] = dp[i-1][0] + nums[i]
现在由于是环形的,所以在上面的基础上,添加了一个限制条件:第一家和最后一个不能同时被偷。
其实我们只需分类讨论第一家的情况即可,他们只是设置初始值的区别:
1:可以偷取第一家
dp[0][0] = 0; dp[o][1] = nums[0];
最终最大值结果为:最后一家不能偷 dp[n-1][0]
2:不可以偷第一家
dp[0][0] = 0; dp[0][1] = 0;
最终最大值结果为 max(dp[n-1][0], dp[n-1][1]);
这两个中情况的结果的最大值,即为最后的结果。
package com.STILLxjy;
public class Main {
public static void main(String[] args) {
int[] nums = new int[]{
5,1,2,3,