題目地址:
https://www.lintcode.com/problem/house-robber/description
給定一個數組,每個位置代表這個位置的財富值。現允許取任意多位置的財富,但不允許取相鄰的。問最多能取多少財富。
思路是動態規劃。設表示前個位置(從開始取)能取到的最大的財富值。那麼對應的就是什麼也不取,所以。對於位置,有兩種情況,若取,則能得到的最大財富值爲;若不取,則能得到的最大財富值爲。所以代碼如下:
public class Solution {
/**
* @param A: An array of non-negative integers
* @return: The maximum amount of money you can rob tonight
*/
public long houseRobber(int[] A) {
// write your code here
if (A == null || A.length == 0) {
return 0;
}
if (A.length == 1) {
return A[0];
}
long[] dp = new long[A.length + 1];
dp[1] = A[0];
for (int i = 2; i <= A.length; i++) {
dp[i] = Math.max(dp[i - 1], A[i - 1] + dp[i - 2]);
}
return dp[A.length];
}
}
時空複雜度。