栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

首先记 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
#include
#define SIZE 6
using namespace std;
int maxProfit(vector& 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 nums= { 7,1,5,3,6,4 };
    cout << maxProfit(nums) << endl;
}

        其中,做了简单优化,例如通过一次遍历,完成两种情况对应值的选择记录(fn),和记录值中最大值(M_profit)的选择。并且记录值这里并没有采用数组记录,而是通过一个变量动态更新来记录。

输入nums[7,1,5,3,6,4]运行结果如下:

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

欢迎点赞评论~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/296218.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号