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

我的个人微信公众号:Microstrong

微信公众号ID:MicrostrongAI

微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的读书笔记!期待您的关注,欢迎一起学习交流进步!

知乎专栏:https://zhuanlan.zhihu.com/Microstrong

Github:https://github.com/Microstrong0305

个人博客:https://blog.csdn.net/program_developer

题目描述:

在数组中取出一个或多个不相邻数,使其和最大,即找到max(不相邻元素组成的子数组)。

题目分析:

(1)最优子结构:

【动态规划】求数组不相邻元素之和最大_第1张图片

OPT(6):表示数组下标为6时,子数组和最大的最优解。最优解又分为两种情况:1.选数组下标为6的数字+OPT(4)。2. 直接是OPT(5)。

(2)状态转移方程:

【动态规划】求数组不相邻元素之和最大_第2张图片

(3)边界条件:

【动态规划】求数组不相邻元素之和最大_第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

题目总结:

相似文章和题目如下:

【1】【LeetCode】198. House Robber

【2】动态规划讲解视频:https://www.bilibili.com/video/av18512769/?spm_id_from=333.788.videocard.0

你可能感兴趣的:(算法)