leetcode-dp-309
/**
<p>给定一个整数数组<meta charset="UTF-8" /><code>prices</code>,其中第 <em> </em><code>prices[i]</code> 表示第 <code><em>i</em></code> 天的股票价格 。</p>
<p>设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):</p>
<ul>
<li>卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。</li>
</ul>
<p><strong>注意:</strong>你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。</p>
<p> </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> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= prices.length <= 5000</code></li>
<li><code>0 <= prices[i] <= 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)
不恋尘世浮华,不写红尘纷扰