这是一个没有“k”约束的问题的解决方案,您首先要做的是:https ://stackoverflow.com/a/13022021/1110808
在我看来,上述解决方案可以很容易地扩展为具有 k 约束,只需修改以下 for 循环中的 if 条件以包含约束: possibleMax < k
// Subproblem solutions, DP
for (int i = start; i <= end; i++) {
int possibleMaxSub1 = maxSum(a, i + 2, end);
int possibleMaxSub2 = maxSum(a, start, i - 2);
int possibleMax = possibleMaxSub1 + possibleMaxSub2 + a[i];
/*
if (possibleMax > maxSum) {
maxSum = possibleMax;
}
*/
if (possibleMax > maxSum && possibleMax < k) {
maxSum = possibleMax;
}
}
正如在原始链接中发布的那样,可以通过添加记忆来改进这种方法,这样就不会重新计算重复子问题的解决方案。或者可以通过使用自下而上的动态编程方法来改进(当前方法是递归自上而下的方法)
您可以在此处参考自下而上的方法:https ://stackoverflow.com/a/4487594/1110808