【JAVA算法题】职业抢劫

题目

/*You are a professional robber planning to rob houses along a street.
 * Each house has a certain amount of money stashed,
 * the only constraint stopping you from robbing each of them is that
 * adjacent houses have security system connected and
 * it will automatically contact the police if two adjacent houses were broken into on the same night.
 * Given a list of non-negative integers representing the amount of money of each house,
 * determine the maximum amount of money you can rob tonight without alerting the police.
 * */
/*你是一个职业抢劫犯,打算沿着街道抢劫房子。
 * 每个房子都有一定量的存款,唯一的约束阻止你抢它们是相邻的房屋有安全系统连接,
 * 它会自动与警方联系,如果两个相邻的房屋被分解成在同一个晚上。
 * 给出一个代表每个房子的钱的非负整数的列表,确定今晚你能抢劫的最大金额而不必报警。
 * */

代码

动态规划法(重点)

 1 //动态规划
 2 import java.util.*;
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner sc = new Scanner(System.in);
 6         int a = sc.nextInt();
 7         int aa[] = new int[a];
 8         for(int i=0;i<aa.length;i++){
 9             aa[i] = sc.nextInt();
10         }
11         if(aa.length==1){
12             System.out.println(aa[0]);
13             return;
14         }
15         if(aa.length==2){
16             System.out.println(Math.max(aa[0],aa[1]));
17             return;
18         }
19         aa[2] += aa[0];
20         if(aa.length==3){
21             System.out.println(Math.max(aa[2], aa[3]));
22             return;
23         }
24         for(int i=3;i<aa.length;i++){
25             aa[i] += Math.max(aa[i-2], aa[i-3]);
26         }
27         System.out.println(Math.max(aa[aa.length-1], aa[aa.length-2]));
28     }
29 }

解析

  最优解的问题一般都可以用动态规划算法

 动态规划算法: 
1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 
2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解 
3.边界条件:即最简单的,可以直接得出的局部最优解

状态转移方程: aa[i] += Math.max(aa[i-2], aa[i-3]); (i>=4)

因为相邻的两个不能一起计算,所以最后还要比较最后一个和倒数第二个的大小以求出最优解

时间: 2024-10-13 02:37:01

【JAVA算法题】职业抢劫的相关文章

趣味Java算法题(附答案)

[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数:    1"); System.out.println("第2个月的兔子对数:    1"

25道经典Java算法题

即使做web开发,也会遇到各种各种需要解决的算法问题,本文节选部分经典练手算法,并提供相关参考答案,希望对你有所帮助[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class test01 { public static void main(String[] args) { int f1=1,f2=1,f; int M=30; System.

面试-java算法题

1.编写一个程序,输入n,求n!(用递归的方式实现). public static long fac(int n){ if(n<=0) return 0; else if(n==1) return 1; else return n*fac(n-1); } public static void main(String [] args) { System.out.println(fac(6)); } 2.编写一个程序,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? pu

网上的一些java算法题的个人练习笔记

1 package com.test; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class Test01 { 10 11 /** 12 * 键盘输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 13 * @throws Exception 14 */

Java算法题2.判断101-200之间有多少个素数,并输出所有素数。

[原创 转载注明出处] 题目2:判断101-200之间有多少个素数,并输出所有素数. 思路: 素数(质数)就是除了1和它本身以外,没有其他的数可以被它整除 java代码实现: 1 package jichu; 2 3 public class jichu2 4 { 5 public static void main(String[] args) 6 { 7 //for循环遍历101-200 8 for(int i = 101; i < 200; i++) 9 { 10 boolean b = f

Java算法题3.打印出所有的“水仙花数”。

[原创 转载注明出处] 题目3:打印出100-999所有的“水仙花数”. 思路: 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身. (例如:1^3 + 5^3+ 3^3 = 153) Java代码实现 1 package jichu; 2 3 public class jichu3 4 { 5 public static void main(String[] args) 6 { 7 int b, s, g; 8 for(int i = 100; i <

经典java算法题及答案

1.使用Java语言编写代码,将一个正整数分解质因数,例如:输入90,打印输出90=2*3*3*5. 答案:public  class  Math{ public  static void  main(String[] args) { int n,i;System.out.println("\nplease input a number:\n");Scanner input=new Scanner(System.in); n=input.nextInt(); System.out.pr

Java算法题:兔子问题

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 解题思路: 1 public int exp(int month){ 2 if(month == 1 || month == 2){ 3 return 1; 4 }else{ 5 return exp(month-1)+exp(month-2); 6 } 7 } 8 @Test 9 public void testExp(){ 10 Formatt

Java算法题:求素数

题目:判断101-200之间有多少个素数,并输出所有素数. 思路:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数. 具体代码: 1 public Vector exp(int first, int end) { 2 Vector v = new Vector(); 3 boolean b; 4 for (int i = first; i <= end; i++) { 5 b = true;// 假设是质数 6 for (int j = 2;