其他分享
首页 > 其他分享> > 动态规划-股票最大收益问题

动态规划-股票最大收益问题

作者:互联网

首先记 f[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