一個無序數組找其子序列構成的和最大,要求子序列中的元素在原數組中兩兩都不相鄰:
可以用遞歸或者循環解決,現有數組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);
}
}