4.1-1:
当数组A的元素均为负数时, FIND_MAXIMUM_SUBARRAY返回整个数组中最大的那个负数,理由如下:
因为递归到底层, 当数组中只有一个元素的时候,开始回升, 最后会回升到数组中有两个值,这两个值就是数组中的前两个值,然后会执行查找只含有这两个数的数组的越过中间的最大子数组, 而此时就是这个数组本身, 最后会比较左、右、越过中间的三个最大子数组的值, 取最大的那个, 因为全为负数, 所以越加越小, 只能是前两个中较大的那个,然后继续回升,重复执行上面的操作,因为在每一次的分解和合并的过程中, 都只选择了几个数中较大的那个,所以当整个数组都比较完成之后,得出的那个最大子数组一定是这个数组中最大的那个负数
4.1-2:
伪代码如下:
find_max_subarray(A):
max_sum=负无穷; //记录最大子数组的值
max_left=max_right = 1; //记录最大子数组的边界
for low=1 to A.length: //让low和high来标记最大子数组的边界
sum=0; //记录所扫描过的区域的和
for high=low to A.length:
sum = sum + A[high];
if sum > sub_sum:
max_sum = sum;
max_left = low;
max_right = high;
return (max_left, max_right, max_sum);
4.1-3:
在我的电脑上,这个n值不确定
递归算法和暴力破解结合后可以提高效率
4.1-5:
根据练习上的提示, 记录数组A[1, j]中的最大子数组, 当数组扩展为A[1, j+1]时, 要么