【动态规划】求数组不相邻元素之和最大

版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。 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

猜你喜欢

转载自blog.csdn.net/program_developer/article/details/83592202