求一个数组中非相邻元素和的最大值问题
1.递归版本
public class Test {
public static int rec_opt(int[] arr, int len) {
if(len==0)
return arr[0];
else if(len==1)
return Math.max(arr[0], arr[1]);
else
return Math.max(rec_opt(arr, len-2)+arr[len], rec_opt(arr, len-1));
}
public static void main(String[] args) {
int[] array = {1,2,4,1,7,8,3};
int length = array.length-1;
System.out.println(rec_opt(array,length));
}
}
- 非递归
递归会产生很多重叠子问题,复杂度非常大。非递归版本集中在数组里面来做,从前面开始存到数组中。
public class Test {
public static int dp_opt(int[] arr) {
int[] opt= new int[arr.length];
opt[0]=arr[0];
opt[1]=Math.max(arr[0], arr[1]);
for(int i=2; i<arr.length; i++) {
int A=opt[i-2]+arr[i];
int B=opt[i-1];
opt[i]=Math.max(A, B);
}
return opt[arr.length-1];
}
public static void main(String[] args) {
int[] array = {1,2,4,1,7,8,3};
System.out.println(dp_opt(array));
}
}