打家劫舍

冷亦蓝發表於2024-11-13

題目

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

給定一個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。

 

示例 1:

輸入:[1,2,3,1]
輸出:4
解釋:偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。
     偷竊到的最高金額 = 1 + 3 = 4 。
示例 2:

輸入:[2,7,9,3,1]
輸出:12
解釋:偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接著偷竊 5 號房屋 (金額 = 1)。
     偷竊到的最高金額 = 2 + 9 + 1 = 12 。
 

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400

方法 動態規劃

分析

1.初始狀態
考慮只有一家或兩家的情況.
f(0) = nums[0];
f(1) = fmax(nums[0],nums[1]);
2.轉移
f(i) = fmax(f(i-2) + nums(i),f(i-1));
3.結束狀態
考慮最後一家是numssize-1 還是numssize-2
return fmax(f(numssize-1),f(numssize-2);

程式碼

int rob(int* nums, int numsSize) {
    if(numsSize == 1) return *nums; //防止陣列越界訪問
    
    int dp[numsSize + 1];
    dp[0] = nums[0];
    dp[1] = fmax(nums[0], nums[1]);
    for (int i = 2; i < numsSize; i++) {
        dp[i] = fmax(dp[i - 2] + nums[i], dp[i - 1]);
    }
    return fmax(dp[numsSize - 1],dp[numsSize - 2]);
}

題目連結:https://leetcode.cn/problems/house-robber/?envType=study-plan-v2&envId=dynamic-programming