一个无序数组找其子序列构成的和最大,要求子序列中的元素在原数组中两两都不相邻:
可以用递归或者循环解决,现有数组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);
}
}