java - 动态规划
问题描述
一个小镇有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
解决方案
我认为您没有正确理解该声明。它说的是,IMO,如果你抢劫街道上的房子,i
你就不能抢劫左边 2 条街道上的房子,soi-1
和i-2
,以及右边 2 条街道上的房子,soi+1
和i+2
。根据这个修改应该可以工作。实际上,在第一个示例中,被抢劫的房屋都在索引中1
,5
因此sum = 20 + 12 = 32
。
推荐阅读
- python - 使用日期数组时,Matplotlib 图在 x 轴上包括附加日期
- google-apps-script - 恢复因错误删除的 Google Apps 脚本
- python - Tkinter:在文本小部件中访问文本输入的问题
- bash - 请求大量密钥时redis-cli“错误:服务器关闭连接”
- python - Python Selenium“点击”元素但没有任何反应
- html - CheckBox 文本与 Checkbox 的距离
- python - 处理 DataFrame 时的性能问题
- javascript - JS中的onload函数和Document Ready函数创建冲突
- python - Visual Studio 2019(不是 VS Code)显示不完整的 python 文档
- java - 位移,得到不正确的值