122. 买卖股票的最佳时机 II
描述
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
分析
第i天只有两种状态,不持有或持有股票,当天不持有股票的状态可能来自昨天卖出或者昨天也不持有,同理,当天持有股票的状态可能来自昨天买入或者昨天也持有中,取最后一天的不持有股票状态就是问题的解。
- dp[i][0]、dp[i][0]:
dp[i][1]是第i天持有股票时有多少钱 dp[i][0]是第i天没有持有股票有多少钱 dp[n-1][0]就是题目的解 - 动态转移方程
dp[i][1]: 第i-1天就持有股票,即:dp[i - 1][1], 第i天买入股票,即:dp[i - 1][0] - prices[i] dp[i][0]: 第i-1天就不持有股票,即:dp[i - 1][0] 第i天卖出股票,即:prices[i] + dp[i - 1][1] - 初始化
dp[0][0] 第一天没有买股票,即有0元 dp[0][1] 第一天买了股票,即有-prices[0]元
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
if(n < 2){
return 0;
}
int[][] dp = new int[n][2];
dp[0][1] = -prices[0];
dp[0][0] = 0;
for(int i = 1; i < n; i++){
dp[i][1] = Math.max(dp[i-1][1] , dp[i-1][0] - prices[i]);
dp[i][0] = Math.max(dp[i-1][0] , dp[i-1][1] + prices[i]);
}
return dp[n-1][0];
}
}
|