动态规划-股票最大收益问题
作者:互联网
首先记 f[n] 为第 n 天卖出股票所获最大利益
情况一(f[n-1]>=0):
如图所示,假设第7天卖出,只要前一天卖出最大获利为正值,则无论第7天值是多少,最大获利均可表示为f[n]=f[n-1]+nums[n]-nums[n-1];
情况二(f[n-1]<0):
如图所示,假设第7天卖出,而前一天卖出最大获利为负值(prices[6]-prices[2]<0),则无论第7天值是多少,最大获利均可表示为f[n]=prices[n]-prices[n-1];
遍历数组中的每一个数,每次选出两种情况中的最大数记录下来,最后再选出这些记录值中的最大值就是可获得的最大利润。
实事上,我们只关心三个数据,前n-1天最小值,第n-1天值prices[n-1],第n天值prices[n]。所谓两种情况,也是根据这三者的关系划分而成。
代码如下:
#include<iostream>
#include<vector>
#define SIZE 6
using namespace std;
int maxProfit(vector<int>& prices) {
int M_profit = 0;
int fn = 0;
for (int i = 1; i < prices.size(); i++) {
fn = max(fn + prices[i] - prices[i - 1], prices[i] - prices[i - 1]);//选出两种情况最大值并记录
M_profit = max(M_profit, fn);//选出以上记录值中的最大值
}
if (M_profit <= 0)return 0;//如果最大值小于等于0,则返回0
else return M_profit;
}
int main() {
vector<int> nums= { 7,1,5,3,6,4 };
cout << maxProfit(nums) << endl;
}
其中,做了简单优化,例如通过一次遍历,完成两种情况对应值的选择记录(fn),和记录值中最大值(M_profit)的选择。并且记录值这里并没有采用数组记录,而是通过一个变量动态更新来记录。
输入nums[7,1,5,3,6,4]运行结果如下:
爽爽怪进阶中......
欢迎点赞评论~
标签:记录,profit,收益,nums,int,prices,动态,规划,fn 来源: https://blog.csdn.net/m0_45932164/article/details/120593969