(动态规划 买卖股票的最佳时机II)leetcode 122

这道题与leetcode 121是差不多的唯一的区别只有dp[i][0]处的一小段表达式

回顾一下此题的dp函数的定义:

1. dp[i][0]存放 持有股票的利润 max(昨天就持有 或  今天才买加上昨天的利润 ps:这就是本题的核心重点 与上题唯一的区别在这里)‘

        /*为什么持有股票会有利润呢,因为这里持有股票时候设负数,使得加的时候就有利润了*/

        (只是我上题便于理解就变成正数取最小值,dpi 1的时候相加了,应当此类题均将dp[i][0]直接买入股票的值设负数)

2. dp[i][1]存放 未持有股票的利润 (昨天就没持有 或 今天才卖出)

换句话说 dp[i][0]就是成本,dp[i][0]就是利润,成本和利润仅取决于昨天

因为可以多次买卖 就用dp[i-1][1]-prices[i] 等价-prices[i]+dp[i-1][1]

而在上题只有-prices[i]

为什么要这么写呢?

因为可以继承前面卖出后的利润,再卖的时候可以加上之前的利润

代码如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        vector<vector<int>>dp(n,vector<int>(2));
        dp[0][0]=-prices[0];//持有股票的最大利润 之前就有股票或者今天买入股票
        dp[0][1]=0;//未持有股票的最大利润 之前就没买股票 今天刚卖
        for(int i=1;i<n;i++)
        {
           

           dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);  //dp[i-1][1]昨天挣到钱的利润来买入股票
                dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);
            
        }
        return dp[n-1][1];
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值