题目链接
解题思路
- 动态规划
- 定义一个数组
dp[len][2]
,其中dp[i][0]
代表第i+1
天结束的时候没持有股票的最大利润,dp[i][1]
表示第i+1
天结束的时候持有股票的最大利润
- 现在求
dp[i][0]
,有两种情况
- 第
i+1
天既没买也没卖,那么最大利润就是第i
天没持有股票的最大利润dp[i-1][0]
- 第
i+1
天卖了一只股票,那么最大利润就是第i
天持有股票的最大利润加上第i+1
天卖出股票的最大利润dp[i-1][1]+prices[i]
- 很明显,状态转移公式就是
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i])
.同理dp[i][1] = max(dp[i-1][1],-prices[i])
- 边界条配件就是第一天的时候如果不持有股票,那么
dp[0][0] = 0
。如果持有股票,那么dp[0][1] = -prices[0]
AC代码
class Solution {
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0)
return 0;
int len = prices.length;
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][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
}
return dp[len - 1][0];
}
}
本地测试代码
package com.company;
public class Solution_121 {
public static int maxProfit(int[] prices) {
if (prices == null || prices.length == 0)
return 0;
int len = prices.length;
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][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
}
return dp[len - 1][0];
}
public static void main(String[] args) {
System.out.println(maxProfit(new int[]{7, 1, 5, 3, 6, 4}));
System.out.println(maxProfit(new int[]{7, 6, 4, 3, 1}));
}
}