leetcode-dp-309

/**
<p>给定一个整数数组<meta charset="UTF-8" /><code>prices</code>,其中第&nbsp;<em>&nbsp;</em><code>prices[i]</code>&nbsp;表示第&nbsp;<code><em>i</em></code>&nbsp;天的股票价格 。​</p>

<p>设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):</p>

<ul>
	<li>卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。</li>
</ul>

<p><strong>注意:</strong>你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。</p>

<p>&nbsp;</p>

<p><strong>示例 1:</strong></p>

<pre>
<strong>输入:</strong> prices = [1,2,3,0,2]
<strong>输出: </strong>3 
<strong>解释:</strong> 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]</pre>

<p><strong>示例 2:</strong></p>

<pre>
<strong>输入:</strong> prices = [1]
<strong>输出:</strong> 0
</pre>

<p>&nbsp;</p>

<p><strong>提示:</strong></p>

<ul>
	<li><code>1 &lt;= prices.length &lt;= 5000</code></li>
	<li><code>0 &lt;= prices[i] &lt;= 1000</code></li>
</ul>
<div><div>Related Topics</div><div><li>数组</li><li>动态规划</li></div></div><br><div><li>👍 1260</li><li>👎 0</li></div>
*/

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int maxProfit(int[] prices) {
		int n = prices.length;


		int[][] dp = new int[n+1][2];
		for (int i = 0; i < n; i++) {

				if(i-1==-1){
					dp[i][0] = 0;
					dp[i][1] = -prices[0];
					continue;
				}
				if(i-1==0){
					dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
					dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
					continue;
				}
				// 需要冷冻期,所以需要持有股票 隔天开始
				dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
				dp[i][1]=Math.max(dp[i-1][1],dp[i-2][0]-prices[i]);

		}
		return dp[n-1][0];
    }
}
//leetcode submit region end(Prohibit modification and deletion)

posted @ 2022-07-15 09:37  小傻孩丶儿  阅读(15)  评论(0编辑  收藏  举报