动态规划法解最大子数组问题
2021-06-21 14:06
标签:引入 lse == 元素 最大子数组 一个 最大 else 分治法 分治法https://www.cnblogs.com/zuofaqi/p/9678356.html 引入了最大子数组问题,它有一个更高效的解决方法就是动态规划法 如果已经直到 A[0...i] 的最大子数组,那么 A[0...i+1] 的最大子数组要么是 A[0...i] 的最大子数组,要么是某个子数组 A[j...i+1] (0 动态规划三要素: 1. 边界:当数组中只有一个元素的时候,最大子数组就是自身 2. 最优子结构:A[0...i+1] 的最优子结构是 A[0...i] 和 A[j...i+1] 3. 状态转移方程:max_arr(A[0...i+1]) = max(A[0...i], A[j...i+1]) 根据这个思路,就可以写出代码了 动态规划法解最大子数组问题 标签:引入 lse == 元素 最大子数组 一个 最大 else 分治法 原文地址:https://www.cnblogs.com/zuofaqi/p/9683727.htmldouble max_arr(double* arr, int index, int& low, int& high)
{
if (0 == index)
{
low = high = 0;
return arr[0];
}
int pre_low, pre_high;
double pre_sum = max_arr(arr, index-1, pre_low, pre_high);
// 找 A[j...i+1]中最大的一个
double maxsum = arr[index] - 1;
for (int i = index; i >= 0; i--)
{
double cursum = 0;
for (int j = index; j >= i; j--)
{
cursum += arr[j];
}
if (cursum > maxsum)
{
maxsum = cursum;
low = i;
}
}
// 比较两个最优子结构的数组和,取最大的一个
if (maxsum > pre_sum)
{
high = index;
return maxsum;
}
else
{
low = pre_low;
high = pre_high;
return pre_sum;
}
}
上一篇:C++的split()函数