版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。 https://blog.csdn.net/program_developer/article/details/83592202
题目描述:
在数组中取出一个或多个不相邻数,使其和最大,即找到max(不相邻元素组成的子数组)。
题目分析:
(1)最优子结构:
OPT(6):表示数组下标为6时,子数组和最大的最优解。最优解又分为两种情况:1.选数组下标为6的数字+OPT(4)。2. 直接是OPT(5)。
(2)状态转移方程:
(3)边界条件:
代码实现:
(1)递归求解
public class sumMax {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1, 2, 4, 1, 7, 8,3};
System.out.println(rec_opt(arr,6));
}
/**
* 递归解法
* @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);
}
}
(2)动态规划法
public class sumMax {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {1, 2, 4, 1, 7, 8,3};
System.out.println(dp_opt(arr));
}
/**
* 递归解法
* @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];
}
}
题目总结:
相似文章和题目如下:
【1】【LeetCode】198. House Robber
【2】动态规划讲解视频:https://www.bilibili.com/video/av18512769/?spm_id_from=333.788.videocard.0