ALG 求最大的利润
算法导论课本习题复现
类似题目:ALG逆序计数
题目描述:
实现时的输入输出:
- 输入:一个长度为n的数组:
p[n]
- 输出:找到最大对的利润 :
max_p
(相较于原题,笔者有所简化,没有按照要求找到该值最大的下标,只是找到了最大值)
具体代码:
优化方向:
在后续的博文中会给出该题目的动态规划策略的代码
分治算法的时间复杂度:
Θ
(
n
⋅
l
o
g
n
)
\Theta(n\cdot logn)
Θ(n⋅logn)
#include <iostream>
using namespace std;
int max_profit(int* p, int left, int right)
{
int mid = (left + right) >> 1; //[left,mid][mid+1, right]
//递归出口
if (right == left)
return -1;
//递归求解左右两边的子问题
int left_profit = max_profit(p, left, mid);
int right_profit = max_profit(p, mid + 1, right);
//求中间区域的最大利润
int min_left = p[left];
for (int i = left + 1; i <= mid; i++)
min_left = min(min_left, p[i]);
int max_right = p[mid + 1];
for (int i = mid + 2; i <= right; i++)
max_right = max(max_right, p[i]);
int mid_profit = max_right - min_left;
//在三个区域内找到最大的利润值,如果没有找到(亏损)都是负数
int result = max(max(left_profit, right_profit), mid_profit);
return result;
}
int main()
{
int n;
cin >> n;
int* p = new int[n];
for (int i = 0; i < n; i++)
cin >> p[i];
int max_p = max_profit(p, 0, n - 1);
if (max_p >= 0)
cout << "max_profit is: " << max_p << endl;
else
cout << "can not find max_profit" << endl;
return 0;
}