一個無序數組找其子序列構成的和最大,要求子序列中的元素在原數組中兩兩都不相鄰

一個無序數組找其子序列構成的和最大,要求子序列中的元素在原數組中兩兩都不相鄰:

可以用遞歸或者循環解決,現有數組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);

	}

}

 

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