状态定义:
dp[i][j]:
下标为 i
这一天结束的时候,手上持股状态为 j
时,我们持有的现金数 【截止到i天,在状态j下的最大利润】。j = 0
,表示当前不持股;j = 1
,表示当前持股。注意:这个状态具有前缀性质,下标为 i
的这一天的计算结果包含了区间 [0, i]
所有的信息,因此最后输出 dp[len - 1][0]
。
状态转移方程:
dp[i][0] = Math.max(dp[i-1][1] + prices[i] , dp[i-1][0]);
dp[i][1] = Math.max(-prices[i] , dp[i-1][1]);
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
if(len < 2){
return 0;
}
int[][] dp = new int[len][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1 ; i < len ; i++){
dp[i][0] = Math.max(dp[i-1][1] + prices[i] , dp[i-1][0]);
dp[i][1] = Math.max(-prices[i] , dp[i-1][1]);
}
return dp[len-1][0];
}
}