LeetCode 121 买卖股票的最佳时机
这题开始dp数组递推过程中要涉及到状态的推导了,dp数组的下标和含义分别设置为对应的天数在买入和卖出下对应的手头最多的钱数。
本题有买入和卖出两种状态,其中当天股票买入状态可由前一天买入价格和前一天之前已经买入子问题的dp值取最大值得到,当天股票卖出状态可由前一天买入dp数组+当天股票价格和前一天卖出dp状态值取最大值得到。
代码如下:
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(-prices[i], dp[i-1][0]);
dp[i][1] = Math.max(dp[i-1][0] + prices[i], dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}
LeetCode 122 买卖股票的最佳时机II
这一题由于卖出后可以再买入,dp数组中每一天买入状态的递推公式需要有所变化,让它可以由前一天卖出+当天价格和前一天买入两个子问题取最大值得到
代码如下:
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][1]-prices[i], dp[i-1][0]);
dp[i][1] = Math.max(dp[i-1][0] + prices[i], dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}