买卖股票的最佳时机
思路:
动态规划:
动规五部曲:
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数组表示持有未持有股票的利润
&spm=1001.2101.3001.5002&articleId=152606224&d=1&t=3&u=08bc00a519a94ffdbd88fe693c896d64)
763

被折叠的 条评论
为什么被折叠?



