[動(dòng)態(tài)規(guī)劃]-打家劫舍

你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋扎拣。每間房內(nèi)都藏有一定的現(xiàn)金赴肚,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入二蓝,系統(tǒng)會(huì)自動(dòng)報(bào)警誉券。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你在不觸動(dòng)警報(bào)裝置的情況下刊愚,能夠偷竊到的最高金額横朋。
輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然后偷竊 3 號房屋 (金額 = 3)百拓。
偷竊到的最高金額 = 1 + 3 = 4 琴锭。

解釋:這道題不是簡單地隔一家偷一家這么簡單,要用動(dòng)態(tài)規(guī)劃去計(jì)算最優(yōu)的收益,如下面這個(gè)例子

[1,3,1,3,100]最大收益為103,就是偷了3和100

代碼:(注釋在代碼中)

import java.lang.reflect.Array;
import java.util.Arrays;

public class Rob {
    public static int rob(int[] nums) {
        int n = nums.length;
        if (n==0) return 0;
        if (n==1) return nums[0];
        if (n==2) return Math.max(nums[1],nums[0]);
        //在此之前都沒有問題,
        // 當(dāng)n=3時(shí),如[1,5,3],在我要去偷第三家時(shí),我
        // 就要考慮到底是選擇當(dāng)前已經(jīng)最大的收益還是把當(dāng)前的放棄去拿走之前和和去偷下一家
        //就相當(dāng)于我之前偷了1,看到下一家有5,那我把這一家是1的還回去,然后偷了5,然后到了第三家,看到有3,然后
        //計(jì)算了一下,如果偷之前的1然后再偷3加起來也沒有5多,就不去偷了
        //再舉一個(gè)栗子[1,3,1,3,100]
        //先偷了1,然后看到3,還回去1,偷了3,看到1,1+1<3,不管,看到3,偷了,看到100,計(jì)算了一下3+100>6,于是把3 還回去
        //把一百偷了,
        //pre相當(dāng)于上一家,cur相當(dāng)于當(dāng)前最大收益,num相當(dāng)于將要偷的一家
        int pre = 0;
        int cur = 0;
        for (int num : nums){
            int temp = cur;
            cur = Math.max(pre+num,cur);
            pre = temp;
            //System.out.println("pre="+pre+"cur="+cur+"num="+num);
        }
        return cur;
    }
}

打家劫舍 二
你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋衙传,每間房內(nèi)都藏有一定的現(xiàn)金决帖。這個(gè)地方所有的房屋都圍成一圈,這意味著第一個(gè)房屋和最后一個(gè)房屋是緊挨著的蓖捶。同時(shí)地回,相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入俊鱼,系統(tǒng)會(huì)自動(dòng)報(bào)警刻像。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你在不觸動(dòng)警報(bào)裝置的情況下并闲,能夠偷竊到的最高金額细睡。

解釋:因?yàn)椴荒芡瑫r(shí)偷第一家和最后一家,其他情況和第一題不變,那就稍微改一下第一題的代碼,取兩種情況的最大值就好

import java.lang.reflect.Array;
import java.util.Arrays;

public class Rob {
    public static int rob(int[] nums) {
        int n = nums.length;
        if (n==0) return 0;
        if (n==1) return nums[0];
        if (n==2) return Math.max(nums[1],nums[0]);
        return Math.max(rob_max(Arrays.copyOfRange(nums,0,n-1)),rob_max(Arrays.copyOfRange(nums,1,n)));
    }
    private static int rob_max(int[] nums) {
        int pre = 0;
        int cur = 0;
        for (int num : nums) {
            int temp = cur;
            cur = Math.max(pre + num, cur);
            pre = temp;
            //System.out.println("pre=" + pre + "cur=" + cur + "num=" + num);
        }
        return cur;
    }
}

打家劫舍 三
在上次打劫完一條街道之后和一圈房屋后,小偷又發(fā)現(xiàn)了一個(gè)新的可行竊的地區(qū)帝火。這個(gè)地區(qū)只有一個(gè)入口溜徙,我們稱之為“根”湃缎。 除了“根”之外,每棟房子有且只有一個(gè)“父“房子與之相連蠢壹。一番偵察之后嗓违,聰明的小偷意識到“這個(gè)地方的所有房屋的排列類似于一棵二叉樹”。 如果兩個(gè)直接相連的房子在同一天晚上被打劫图贸,房屋將自動(dòng)報(bào)警蹂季。

計(jì)算在不觸動(dòng)警報(bào)的情況下,小偷一晚能夠盜取的最高金額疏日。
示例 1:

輸入: [3,2,3,null,3,null,1]

image.png

輸出: 7
解釋: 小偷一晚能夠盜取的最高金額 = 3 + 3 + 1 = 7.

解釋:一種情況是第二層,另一種情況是第一層+第三層

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public static int rob(TreeNode root) {
        return SolutionTree(root).val;
    }
    public static TreeNode SolutionTree(TreeNode root){
        if (root == null){
            TreeNode treeNode = new TreeNode(0);
            return SolutionTree(treeNode);
        }
        if (root.left == null &&root.right == null){
            root.left = new TreeNode(0);
            root.right = new TreeNode(0);
            return root;
        }
        root.left = SolutionTree(root.left);
        root.right = SolutionTree(root.right);
        root.val = Math.max(root.left.val+root.right.val,root.val+root.left.left.val+
                root.left.right.val+root.right.left.val+root.right.right.val);
        return root;
    }
}

可以變化為打家劫舍的題:
給定一個(gè)整數(shù)數(shù)組 nums 乏盐,你可以對它進(jìn)行一些操作。

每次操作中制恍,選擇任意一個(gè) nums[i] 父能,刪除它并獲得 nums[i] 的點(diǎn)數(shù)。之后净神,你必須刪除每個(gè)等于 nums[i] - 1 或 nums[i] + 1 的元素何吝。

開始你擁有 0 個(gè)點(diǎn)數(shù)。返回你能通過這些操作獲得的最大點(diǎn)數(shù)鹃唯。

輸入: nums = [3, 4, 2]
輸出: 6
解釋:
刪除 4 來獲得 4 個(gè)點(diǎn)數(shù)爱榕,因此 3 也被刪除。
之后坡慌,刪除 2 來獲得 2 個(gè)點(diǎn)數(shù)黔酥。總共獲得 6 個(gè)點(diǎn)數(shù)洪橘。

class Solution {
    public static int deleteAndEarn(int[] nums) {
      int n = nums.length;
        if (n==0) return 0;
        if (n==1) return nums[0];

        int max1 = 0;

        for (int i=0;i<n;i++){
            max1 = Math.max(nums[i],max1);
        }

        int[] trans = new int[max1+1];
        for (int num:nums){
            trans[num-1] += num;
        }
        //System.out.println(Arrays.toString(trans));

        int cur = 0;
        int pre = 0;

        for (int num : trans){
            int temp = cur;
            cur = Math.max(pre+num,cur);
            pre = temp;
        }
        return cur;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末跪者,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熄求,更是在濱河造成了極大的恐慌渣玲,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟晚,死亡現(xiàn)場離奇詭異忘衍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卿城,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門枚钓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑟押,你說我怎么就攤上這事搀捷。” “怎么了勉耀?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵指煎,是天一觀的道長蹋偏。 經(jīng)常有香客問我便斥,道長至壤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任枢纠,我火速辦了婚禮像街,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晋渺。我一直安慰自己镰绎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布木西。 她就那樣靜靜地躺著畴栖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪八千。 梳的紋絲不亂的頭發(fā)上吗讶,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音恋捆,去河邊找鬼照皆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沸停,可吹牛的內(nèi)容都是我干的膜毁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼愤钾,長吁一口氣:“原來是場噩夢啊……” “哼瘟滨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起能颁,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤室奏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后劲装,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧沫,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年占业,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绒怨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谦疾,死狀恐怖南蹂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情念恍,我是刑警寧澤六剥,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布晚顷,位于F島的核電站,受9級特大地震影響疗疟,放射性物質(zhì)發(fā)生泄漏该默。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一策彤、第九天 我趴在偏房一處隱蔽的房頂上張望栓袖。 院中可真熱鬧,春花似錦店诗、人聲如沸裹刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捧弃。三九已至,卻和暖如春擦囊,著一層夾襖步出監(jiān)牢的瞬間违霞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工霜第, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葛家,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓泌类,卻偏偏與公主長得像癞谒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子刃榨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355