1. 程式人生 > 其它 >leetcode-198 打家劫舍

leetcode-198 打家劫舍

leetcode-198 打家劫舍

  1. 題目

    你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

  2. 解題思路

    本體使用動態規劃思想解答,所以需要列出狀態轉移方程。因該小偷會經過所有的房間,他每次經過一個房間,會有兩種狀態

    1. 可以偷【i】這個房間,則【i-1】這個房間沒有被偷
    2. 不可以偷這個房間,則【i-1】這個房間被偷了

    因此到達第【i】個房間時,他所能得到的現金為max({第【i-1】房間被偷時得到的現金},{第【i-2】房間被偷,再偷第i個房間得到的現金})

    所以動態轉移方程為 $ dp[i]=max(dp[i-1],dp[i-2]+nums[i]) $$

  3. code

#include <iostream>
#include <vector>
using namespace std;

class Solution {
 public:
  int rob(vector<int>& nums) {
    if (nums.size() == 0) {
      return 0;
    }
    if (nums.size() == 1) {
      return nums[0];
    }
    if (nums.size() == 2) {
      return nums[0] > nums[1] ? nums[0] : nums[1];
    }
    int dp[100] = {0};
    dp[0] = nums[0];
    dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
    for (int i = 2; i < nums.size(); i++) {
      dp[i] =
          dp[i - 1] > (dp[i - 2] + nums[i]) ? dp[i - 1] : (dp[i - 2] + nums[i]);
    }
    return dp[nums.size() - 1];
  }
};

int main() {
  return 0;
}