[算法]数组中求出下标不连续的任意个数,使得和最大
2018-09-16 21:56
381 查看
给定一个数组,可以从数组中取出下标不连续的任意个数,求可以取出的数的和的最大值,例如:给出数组A[]={1,2,2,5,3,4,3}可以取出的最大和为2+5+4=11。现再给定数组{3,9,7,5,1,3,1,2,7},能取出的数的和的最大值是24。
方法一:动态规划
假设原数组为arr,辅助数组为data. 则data[0] = arr[0], data[i] = max{arr[0], arr[1]}.
i>=2时, data[i] = Max{data[i-1], data[i-2]+arr[i]}
data[i]表示以子数组arr[0..i]符合条件的最大值。
public static int getMaxValue(int[] arr){ int[] data = new int[arr.length]; data[0] = arr[0]; data[1] = Math.max(arr[0], arr[1]); for (int i = 2; i < arr.length; i++) { int val = arr[i]; data[i] = Math.max(data[i - 1], data[i - 2] + val); } return data[data.length - 1]; }
方法二:非动态规划
public static int getMaxValue2(int[] arr) { int sum1 = 0, sum2 = 0; for(int i = 0; i < arr.length; i++){ if(i % 2==0){ sum1 = Math.max(sum2, sum1 + arr[i]); }else{ sum2 = Math.max(sum1, sum2 + arr[i]); } } return Math.max(sum1,sum2); }
相关文章推荐
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- 数组中取出下标不连续的任意个数,求取出的数的和的最大值
- 数组中取出下标不连续的任意个数,求取出的数的和的最大值
- 《算法竞赛-训练指南》第一章-1.24_pre-一维数组最大连续和
- 每天一道LeetCode----从数组中选择若干不连续元素使得总和最大
- 算法3:找出一个整数数组里面两个查值最大的两个下标a[j]-a[i]最大并且i<j
- 算法--求先递增后递减数组最大值的下标
- 算法复习:连续子数组的最大和
- 算法习题45:对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一;;;一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 子数组的最大和[算法]HDU1003/HDU1231/找到这些数使得它满足:它是左边的最大值且是右边的最小值
- 【连续】子数组之和最大并得到子数组的下标边界
- 编写一个PHP函数。求任意n个正负整数里面最大的连续和,要求算法时间复杂度尽可能低。
- 要求一个数组连续下标和的最大值,数组的元素可正、可负、可为零
- 笔试面试算法经典--连续子数组的最大乘积及连续子数组的最大和(Java)
- 计算一串连续数组的之间 连续几个数(任意连续)之和的最大值 Microsoft Visual Studio
- 算法---数组中连续子数组和最大值
- 贪心算法解决求数组最大连续和
- 给定任意数组获取任意连续的项求和的最大值,并输出新的数组
- 算法 给出一个数组,求连续相邻的最大面积
- 面试算法(三十一)连续子数组的最大和