算法学习 || 动态规划(买卖股票的最佳时机)

买卖股票的最佳时机

思路:

动态规划:

动规五部曲:

1.dp数组及其下标含义:

dp数组表示持有股票的利润(持有表示两个动作:1.之前买入,当前不卖出。2.当前买入),或者未持有股票的利润。使用二维数组,行(有多少天就有多少行)表示每一天,列(2列)表示持有和未持有的状态

2.确认递推数列:

1.持有股票状态的递推数列:dp[i][0] = max(dp[i-1][0] , -prices[ i ]);今天的持有股票利润由昨天决定和今天决定,要哪一天持有通过取最大值决定(注意dp数组表示利润,持有则要支付钱,当前利润就为负数,所以取最大值不影响)
2.未持有股票状态的递推数列:dp[ i ][ 1 ] = max(dp[i-1][1],prices[i] + dp[i-1][0]);同理取最大值。(注意dp数组中是利润,亏损为负,所以prices[i] + dp[i-1][0]直接加就行)

3.dp数组的初始化

dp[0][0] = -prices[0]; 持有的初始就是买入第一天
dp[0][1] = 0; 未持有的初始就是第一天不买入

4.遍历顺序:

从前往后

代码:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        if (len == 0) return 0;
        vector<vector<int>> dp(len,vector<int>(2));
        dp[0][0] -=prices[0];//dp数组表示的实际上是利润
        dp[0][1] = 0;
        for(int i =1;i<len;i++)//遍历天数
        {
            dp[i][0] = max(dp[i-1][0],-prices[i]);
            dp[i][1] = max(dp[i-1][1],prices[i] + dp[i-1][0]);//注意dp数组中是利润,亏损为负,所以直接加就行
        }
        return dp[len-1][1];
    }
};

遇到的问题:

dp数组的理解:dp数组表示持有未持有股票的利润

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值