发现从0开始推导不出结果,只能取一个一般状态,如果现在是第i个位置,f(i)表现在i位置的最大和。自然就转化为动态规划问题。
推导出中间状态公式:max(dp[i-2]+num[i],dp[i-1])
* 递归解法
* @param arr
* @param i
* @return
*/
public static int rec_opt(int[] arr, int i) {
if(i == 0)
return arr[0];
else if (i == 1)
return Math.max(arr[0], arr[1]);
else {
int a = rec_opt(arr, i-2) + arr[i];
int b = rec_opt(arr, i-1);
return Math.max(a, b);
}
}
/**
* 动态规划解法
* @param arr
* @return
*/
public static int dp_opt(int[] arr) {
int[] opt = new int[arr.length];
opt[0] = arr[0];
opt[1] = Math.max(arr[0], arr[1]);
for(int i=2; i<arr.length; i++) {
int a = opt[i-2] + arr[i];
int b = opt[i-1];
opt[i] = Math.max(a, b);
}
return opt[arr.length-1];
}
小偷盗窃题,不偷挨边户
很牛逼的算数题
字数限制。。。
for (int i=2; i opt[i]=Math.max(opt[i-2]+num[i],num[i-1]); int max = Math.max(max,opt[i+1]);
}
for (int i=0;i
}
Dp[i]=max(Dp[i-2]+A[i],Dp[i-1])
Dp[i]=max(Dp[i-2]+A[i],Dp[i-1])