【问题标题】:Dynamic parogramming动态规划
【发布时间】: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 这就是我的想法和回答。

标签: java dynamic


【解决方案1】:

我认为您没有正确理解该声明。它说的是,IMO,如果你抢劫街道i 上的房子,你就不能抢劫左边两条街道上的房子,所以i-1i-2,以及右边两条街道上的房子,所以i+1i+2。根据这个修改应该可以工作。实际上,在第一个示例中,被抢劫的房屋位于索引 15,因此是 sum = 20 + 12 = 32

【讨论】:

  • 你这么认为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2012-10-29
  • 2015-06-11
  • 2012-03-26
  • 2020-06-20
相关资源
最近更新 更多