动态规划复习day03
今天来看股票问题1
题目一:买卖股票的最佳时机
解题思路
首先我们想到的不是动态规划的解法,是一个常规思路:找到后面与当前值的差值最大的那个值,即为我们需要找的卖出的day。因此贴出代码如下:
class Solution {
public int maxProfit(int[] prices) {
if(prices.length == 0)
return 0;
int max = 0;
int min = prices[0];
for(int i=1;i<prices.length;i++){
min = Math.min(min,prices[i]);
max = Math.max(max,prices[i]-min);
}
return max;
}
}
这不是我们想要的结果,我们需要通用的动态规划解法。
以此继续使用我们之前用的办法:找到dp数组的含义,直接看不出来,没关系,我们按照框架走:
第一步找到状态和选择:状态也就是股票的价格,选择为股票的买卖与否。
第二步找到dp之间的关系:我们假设dp [i] [0] 为股票在第i天我手上没股票时的利润,dp [i] [1]为股票在第i天手上有股票的利润。
第三步找到他们之间的转移关系,也就是状态转移方程。在此之前先确认我们最终要求的目标,是股票卖出之后的最大值:dp [i] [1]中的最大值。而转移关系也很明确,
-
dp [i] [1] = max (dp[i-1] [1],0-prices[i]);
今天手里有股票的利润:要么我昨天手里就已经有股票了,今天啥都没干;要么昨天没股票,我今天买了一股。
-
dp [i] [0] = max(dp [i-1] [0],dp[i-1] [1] + price[i]);
今天手里没股票的利润:要么昨天我就没股票,我今天啥也没干;要么昨天我有股票,今天我卖了。
如此即可完成代码如下:
代码实现
class Solution {
public int maxProfit(int[] prices) {
if(prices.length == 0)
return 0;
int[][] dp = new int[prices.length][2];
// base case
dp[0][0] = 0;
dp[0][1] = -prices[0];
// dp转移过程
for (int i = 1; i < prices.length; i++) {
dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i]);
dp[i][1] = Math.max(dp[i-1][1],-prices[i]);
}
return (dp[prices.length - 1][0] <= 0) ? 0 : dp[prices.length-1][0];
}
}
如此更加理解本题的思路过程,而不是简单的列举最大最小值。明天继续写后续的几道进阶题,加油!