动态规划

best-time-to-buy-and-sell-stock

http://www.nowcoder.com/questionTerminal/64b4262d4e6d4f6181cd45446a5821ec

dp[i]表示到i天时候卖出(天数从0开始编号)所能取得的最大收益,所以第i-1天必须持有(当天买当天卖的情况就是0,编程时将答案ans初始化为0就不需要考虑当天买卖了)。那么就是看是第i-1天之前买入的,还是第i-1天买入的了,即

图片说明

也就是说,当dp[i-1]为负的时候,就直接取这一天的"收益"就行了(当然这一天的"收益"也可能是负的,只是不必考虑当天买当天卖的情况了,如前面所解释的只要将ans最开始设置为0就行了)。

另外,因为dp[i]只可能使用了上一时刻的dp[i-1],而且ans可以在dp生成过程中算出来,所以没必要把dp开成数组了,直接用一个int dp就完事了。

class Solution {
public:
    int maxProfit(vector<int> &v) {
        int len = v.size();
        int dp = 0;
        int ans = 0;
        for(int i=1;i<len;i++) {
            if(dp<0)
                dp = v[i] - v[i-1];
            else
                dp = dp + v[i] - v[i-1];
            if(dp > ans)
                ans = dp;
        }
        return ans;
    }
};
全部评论
仔细看下来发现如果dp大于零,则中间变量会被消除。如果dp一直大于零,说明一开始的被减数比任意一天的票价都要低,如dp突然变得小于零,则第i天的票价比已知的最小值还要小,所以在下一次循环中将dp重新初始化。但是这只能保证被减数是最小的,不能保证减数是最大的,所以需要ans存储最大值。
1 回复 分享
发布于 2021-08-08 11:28
看懂了, dp[i]=max(到第i−1天为止的收益+当前这天的收益,当前这天的收益) 可以看成: dp[i]=max(【第1~i-2天最低价买入,第i天卖出收益】,【第i-1天买入,第i天卖出的收益】) dp[i]表示第1~i-1天最低价买入,第i天卖出的收益(没有包括第i天买第i天卖,因为ans初始值是0)
1 回复 分享
发布于 2020-12-05 15:13
这样不会多次买入卖出吗?
点赞 回复 分享
发布于 2021-08-08 11:10
股票不能当天买入当天卖出
点赞 回复 分享
发布于 2021-06-13 16:51
为啥不能直接取最大值,最小值来计算
点赞 回复 分享
发布于 2021-06-10 16:42
看不懂。。。
点赞 回复 分享
发布于 2020-12-04 00:58
写得很清楚啊,学习了
点赞 回复 分享
发布于 2020-09-19 10:45

相关推荐

09-01 17:26
已编辑
门头沟学院
点赞 评论 收藏
分享
况世奇才:我七月投的Java,面试官说搞大数据的,挂个Java的吸引进来投简历的,已经offer评估了看看能不能泡出来吧
点赞 评论 收藏
分享
评论
26
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务