一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻

一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻:

可以用递归或者循环解决,现有数组arr[暂不舍定数量],最大不相邻数之和=maxsum,思路:

1、假如数组只有1 个值,那么maxsum1 = arr[0],

2、假如数组有2 个值,那么这个最大和maxsum2 = max(arr[0],arr[1]),

3、假如数组有3 个值,那么最大值肯定要么是arr[0]+arr[2],要么是arr[1],也就是maxsum3=max( arr[0]+arr[2] ,arr[1] ),

4、假如数组有4 个值,最大值maxsum4 =max( arr[0]+arr[2], arr[1]+arr[3] );


5、假如数组有5个值,最大值maxsum5 =max(maxsum3+arr[i], maxsum4 );//保证不连续

6、假如数组有6个值,最大值maxsum6 = max(  maxsum4+arr[i] ,maxsum5  )

。。。。

发现了么:

从5开始有规律了,5中的maxsum5= max( maxsum3+当前数组值,maxsum4 );

前n-2项的最大不相邻子序列的和记做a,前n-1项的最大不相邻子序列的和记做b,第n项的数值c,则前n项的最大不相邻子序列的和为max{a+c , b },以此为循环体进行循环

package algrothms;

public class CalcBigestSumTopN {
	public static int comp(int a, int b) {
		if (a == b)
			System.out.println("a==b");
		return a >= b ? a : b;
	}

	public static int sumTopN(int[] arr) {
		if (arr.length == 0)
			return -1;
		if (arr.length == 1)
			return arr[0];
		if (arr.length == 2)
			return comp(arr[0], arr[1]);
		int a = arr[0];
		int b = comp(arr[0], arr[1]);
		int c = 0;
		for (int i = 2; i < arr.length; i++) {
			c = comp(a + arr[i], b);
			a = b;
			b = c;
		}
		System.out.println("c= " + c);
		return c;
	}

	public static void main(String[] args) {
		int[] arr = { 5, 4, 10, 100, 10, 5, 7 };
		int x = sumTopN(arr);
		System.out.println("x= " + x);

	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章