leecode198 打家劫舍問題 輸出路徑

2022-10-11 12:21:11 字數 2076 閱讀 4306

/* 

*/import

j**a.util.arraylist;

import

j**a.util.collections;

import

j**a.util.list;

/*** @description: 打家劫舍問題

* @filename: package_name.leecode198

* @author

: wwx1062477

* @date: 2022-05-24 10:38

**/public

class

leecode198

if (length == 1)

//定義乙個n行2列的陣列來表示偷前n號房能活得的最大金額

int dp = new

int[length][2];

dp[0][0] = 0;//

表示不偷第一間房

dp[0][1] = nums[0];//

表示偷第一間房

dp[1][0] = nums[0];//

不偷第二號房,那就肯定要偷第一間房

dp[1][1] = nums[1];//

偷第二號房,那就肯定不要偷第一間房

for (int i = 2; i < length; i++)

int target = math.max(dp[length - 1][0], dp[length - 1][1]);

list

track = new arraylist<>();

for (int i = length - 1; i >= 0; i--)

}collections.reverse(track);

return

track;

}public

static

void

main(string args) ;

int money2 = ;

"rob(money1) = " + rob(money1));

system.out.println("rob(money2) = " +rob(money2));

}}

198.打家劫舍

dp陣列定義:dp[i]代表偷竊0~i號房屋所能獲得的最大金額

遞推公式:偷竊0~i號房屋所能獲得的最大金額也就是要麼偷竊i號房屋,那麼他只能偷竊i號房屋前面的前面的房屋,也就是dp[i-2]+nums[i],

要麼不偷竊i號房屋,那麼他可以偷竊i前面的房屋,也就是dp[i-1]

因此遞推公式為dp[i] = math.max(dp[i - 1], dp[i - 2] + nums[i]);

初始化:需要考慮偷竊第一號房屋和第二號房屋的最大金額

只能偷竊第一號房屋,最大金額肯定為nums[0]

只能偷竊第一號房屋和第二號房屋,若想獲得最大金額,只能從一號房屋和二號房屋中選金額最大的

class solution

int dp = new int[nums.length];

dp[0] = nums[0];

dp[1] = math.max(nums[0], nums[1]);

for (int i = 2; i < nums.length; i++)

return dp[nums.length - 1];}}

輸出路徑

dp陣列定義:dp[i][0]代表不偷第i號房屋所能獲得最大金額

dp[i][1]代表偷第i號房屋所能獲得最大金額

遞推公式:不偷第i號房屋所能獲得最大金額就是一定得偷第i號房屋也就是dp[i][0] = dp[i - 1][1]

偷第i號房屋所能獲得最大金額有兩種情況:

偷i-2號房屋,這個好理解

不偷i-2號房屋,比如說[2,1,1,2]

兩者取最大的,也就是dp[i][1] = math.max(dp[i - 2][1] + nums[i], dp[i - 2][0] + nums[i])

計算路徑:得出dp陣列後,因為是要計算偷了那幾家,因此路徑一定是偷了的那家,也就是dp[i][1],然後倒序遍歷,如果偷了第i家的最大金額等於target,那就記錄路徑

198 打家劫舍

很明顯是dp問題。用乙個一維陣列表示dp陣列,狀態轉移方程為 resmax index max nums index resmax index 2 resmax index 1 其中resmax儲存,遍歷到該節點時的,最大值。注意,遍歷到該節點,但該節點不一定選。另外該題的初始解要想清楚。即resm...

198 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...

198 打家劫舍

你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...