Question:
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
首先,它可以进行两次交易,立即反应到要用分治。在0~N个价格中,选取第i个为分治点。需计算出0~i的最大利润,再计算出i~N-1的最大利润。
计算过程中如果,如果用函数方法一个个计算,系统会报超时。
这个当然可以用动态规划的方法来改善。先做两次扫描,代码如下
int maxProfit3(vector<int> &prices) {
// 基于分治思想,分治中使用动态规划
int N=prices.size();
if(N==0)
return 0;
vector<int> vPro1,vPro2;
int tmp,ret,pl,ph;
tmp=0;
pl=prices[0];
for(int i=0;i<N;i++){ //前向遍历,计算0~i区间内最大差值
tmp=max(tmp,prices[i]-pl);
vPro1.push_back(tmp);
pl=min(pl,prices[i]);
}
tmp=0;
ph=prices[N-1];
for(int i=N-1;i>=0;i--){ //后向遍历,计算i~N-1区间内最大差值
tmp=max(tmp,ph-prices[i]);
vPro2.push_back(tmp);
ph=max(ph,prices[i]);
}
ret=0;
for(int i=0;i<N;i++){ //找到最佳分治点
ret=max(ret,vPro1[i]+vPro2[N-1-i]);
}
return ret;
}