//打家劫舍
/** 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是
* 相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
* 給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下,一夜之內能夠偷竊到的最高金額
* */
public
class
p47 ; //4
int nums = new
int; //
12 system.out.println(maxmoney(nums, nums.length-1));
system.out.println(maxmoney2(nums));
system.out.println(maxmoney3(nums));
}//遞迴
public
static
int maxmoney(int nums, int
index)
if(index == 0)
//遞推公式,i-1 和 i-2+nums[i]的最優解
return math.max(maxmoney(nums, index-1), maxmoney(nums, index-2)+nums[index]);
}//存在重複計算,左邊會遞迴i-1,i-2,i-3,右邊也同樣i-2、i-3...
//把遞迴的陪一次記錄存起來,就是動態規劃中的dp陣列
//用遞迴就是dp有值得時候直接取,沒值得時候遞迴,就避免重複遞迴的問題
//動態規劃-迭代(不用遞迴)
public
static
int maxmoney2(int
nums)
if(length == 1)
int dp = new
int[nums.length];
dp[0] = nums[0];
dp[1] = math.max(nums[0], nums[1]);
//有了0和1這兩個數,就可以推斷其他數
//迭代
for(int i=2; i)
return dp[length-1]; //
最後位置就是最優解
}
//上面的方法占用空間複雜度高,有些資料存起來但又不使用
//優化
public
static
int maxmoney3(int
nums)
if(length == 1)
int first = nums[0];
int second = nums[1];
for(int i=2; i)
return
second;
}}
198 打家劫舍(動態規劃)
你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。示例 1 輸入 1...
198 打家劫舍(動態規劃)
1.問題描述 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你不觸動警報裝置的情況下 一夜之內能夠偷竊到的最高金額...
213 打家劫舍 II golang 動態規劃
213.打家劫舍 ii 198.打家劫舍 你是乙個專業的小偷,計畫偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第乙個房屋和最後乙個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存...