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

首先记 f[n] 为第 天卖出股票所获最大利益

情况一(f[n-1]>=0):

        如图所示,假设第7天卖出,只要前一天卖出最大获利为正值,则无论第7天值是多少,最大获利均可表示为f[n]=f[n-1]+prices[n]-prices[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]运行结果如下:

爽爽怪进阶中......

欢迎点赞评论~

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值