1. 程式人生 > >演算法題——House Robber(JAVA)

演算法題——House Robber(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.確定狀態
在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為一個“狀 態”。一個“狀態”對應於一個或多個子問題, 所謂某個“狀態”下的“值”,就是這個“狀 態”所對應的子問題的解。
3.確定一些初始狀態(邊界狀態)的值
4. 確定狀態轉移方程
定義出什麼是“狀態”,以及在該“狀態”下的“值”後,就要找出不同的狀態之間如何遷移――即如何從一個或多個“值”已知的 “狀態”,求出另一個“狀態”的“值”(遞推公式)。

解題思路:
1. 將原問題分解為子問題

今天偷不偷

2.確定狀態

每間房子可以有兩個狀態:偷或者不偷

3.確定一些邊界狀態

當走到最後一間房子的時候結束

4.確定狀態轉移方程

判斷偷和不偷這件房子,那個收益大,將收益大的選作最佳方案

提交程式碼:

public class Solution {
    public int rob(int[] nums) {
        int rob = 0;
        int unrob = 0;
        int todayrob = 0;
        for (int i = 0; i < nums.length; i++) {
            //沒偷前一家的情況下來偷這一家
todayrob = unrob + nums[i]; //不偷這一家的收益=max(沒偷前一家,偷了前一家) unrob = unrob > rob ? unrob : rob; //偷這一家的收益 rob = todayrob; } //目前最大收益=max(沒偷最後一家,偷了最後一家) return unrob > rob ? unrob : rob; } }