算法学习 || 动态规划(买卖股票的最佳时机)
买卖股票的最佳时机
思路:
动态规划:
动规五部曲:
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数组表示持有未持有股票的利润