赞
踩
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- if (prices.size() == 0) return 0;
- vector<int> dp(prices.size(), 0);
- dp[0] = 0;
- int mint = INT_MAX;
- for (int i = 1; i < prices.size(); i++){
- //更新最小股票值
- mint = min(mint, prices[i - 1]);
- //max(前一天的利润,今日利润)
- dp[i] = max(dp[i - 1], prices[i] - mint);
- }
- return dp[prices.size() - 1];
- }
- };
1.dp数组(dp table)以及下标的含义:dp[i][0] 表示第i天持有股票所得最多现金,dp[i][1] 表示第i天不持有股票所得最多现金
注意这里说的是“持有”,“持有”不代表就是当天“买入”!也有可能是昨天就买入了,今天保持持有的状态
2.递推公式
如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);
如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来
同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
3.初始化:基础都是要从dp[0][0]和dp[0][1]推导出来。dp[0][0] -= prices[0];、dp[0][1] = 0;
- 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[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]);
- }
- return dp[len - 1][1];
- }
- };
本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。
那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- int len = prices.size();
- vector<vector<int>> dp(len, vector<int>(2, 0));
- dp[0][0] -= prices[0];
- dp[0][1] = 0;
- for (int i = 1; i < len; i++) {
- dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]); // 注意这里是和121. 买卖股票的最佳时机唯一不同的地方。
- dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
- }
- return dp[len - 1][1];
- }
- };
1.dp数组以及下标的含义
一天一共就有五个状态,
dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。
2.递推公式
达到dp[i][1]状态,有两个具体操作:
那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?
一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);
同理dp[i][2]也有两个操作:
所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])
同理可推出剩下状态部分:
dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
3.初始化:dp[0][0] = 0; dp[0][1] = -prices[0]; dp[0][2] = 0; dp[0][3] = -prices[0]; dp[0][4] = 0;
- class Solution {
- public:
- int maxProfit(vector<int>& prices) {
- if (prices.size() == 0) return 0;
- vector<vector<int>> dp(prices.size(), vector<int>(5, 0));
- dp[0][1] = -prices[0];
- dp[0][3] = -prices[0];
- for (int i = 1; i < prices.size(); i++) {
- dp[i][0] = dp[i - 1][0];
- dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
- dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
- dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
- dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
- }
- return dp[prices.size() - 1][4];
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。