【发布时间】:2015-10-13 02:02:23
【问题描述】:
示例:
数字是 [1, 2, 3] 并且你有 +, *
最大值为 1+2*3
例子 [1, 1, 1] , ans 是 1+1+1
我能想到一个简单的递归算法:
private static double helper(double[] arr, int s, int e) {
System.out.println("s= " + s + " e= " + e);
//base case: if single elem, return that eleme
if (e==s) {
return arr[s];
} if (s+1==e) {
return Math.max(arr[s]+arr[e], arr[s]*arr[e]);
} else if (s>e) {
//this should never happen
throw new UnsupportedOperationException("invalid operation");
}
//int mid = s+ ((e-s)/2);
int mid=s;
double fMax = Double.MIN_VALUE;
for (mid=s;mid<e;mid++) {
//divide and conqr route
double lres = helperDQ(arr,s, mid);
double rres = helperDQ(arr,mid+1, e );
System.out.println("s= " + s + " e = " + e + " m = " + mid + " lres= " + lres + " rres= " + rres);
fMax = Math.max(fMax, Math.max(lres*rres, lres+rres));
}
return fMax;
}
private static double findMax(double[] arr) {
return helper(arr, 0, arr.length-1);
}
有没有更好的方法来代替这种递归方式?我们可以通过检查 s, e 来修剪递归,因此我们最终不会多次递归同一事物。
想不出一种简单的动态编程方法。
有什么建议吗?
【问题讨论】:
-
0 和 1 应始终相加,任何其他值应相乘。您想将可用的最小数字加 1。
-
它可以很容易地使用链矩阵乘法的变体来完成,我想它已经在 SO 上回答过很多次了
标签: java algorithm recursion dynamic-programming backtracking