【发布时间】:2018-06-06 02:38:54
【问题描述】:
一个小镇有N条街道,每条街道都有一个宝库,里面有一定数量的金币-C(1) .... C(N)。由于强盗很聪明,为了不被抓住,如果他在给定街道的房子里抢劫,他不会在与被抢劫房子相邻的两条街道上的房子里抢劫(无论是左边还是右边)。因此,他避免了人们的意识,并且降低了他的风险。给定 N 和每个宝库中的硬币 C(i)(其中 i=1 到 N),求出盗贼最多可以获得的金币 M。
import java.util.Scanner;
public class MaximiseRobbery {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int houses = scan.nextInt();
int[] amPerHouse = new int[houses];
for (int i = 0; i < houses; i++) {
amPerHouse[i] = scan.nextInt();
}
int maximumRobbery = maximizeRobbery(amPerHouse, houses);
System.out.println(maximumRobbery);
scan.close();
}
private static int maximizeRobbery(int[] amPerHouse, int houses) {
if (houses == 1) {
return amPerHouse[0];
} else if (houses == 2) {
return Math.max(amPerHouse[0], amPerHouse[1]);
}
int[] dp = new int[amPerHouse.length];
dp[0] = amPerHouse[0];
dp[1] = amPerHouse[1];
for (int i = 2; i < houses; i++) {
dp[i] = Math.max(dp[i - 2] + amPerHouse[i], dp[i - 1]);
}
return dp[houses - 1];
}
}
输入:
7
10 20 15 1 9 12 5
输出:
32
但是根据上面的实现得到的输出是39
也用于输入:
10
5 6 6 16 30 15 13 16 19 27
输出:
63
但是根据上面的实现得到的输出是84
【问题讨论】:
-
你试过什么?你为什么要我们做你的功课?
-
你确定问题陈述是正确的吗?
-
边界条件可能不正确 - 看起来代码可以选择第二个相邻的房子,而它应该至少是第三个相邻的房子。
-
@AndrewS 这就是我的想法和回答。