方法1:直接对比法
如果今天的价格比昨天的贵,那就直接算 最大利润 = 今天的价格 - 昨天的价格
public int maxProfit(int[] prices) {
int maxProfit = 0;
for(int i = 1; i < prices.length; i++){
if(prices[i-1]<prices[i]){
maxProfit += prices[i] - prices[i-1];
}
}
return maxProfit;
}
方法2:动态规划法:
等从第二天的状态 = 第一天的状态基础上怎样怎样来考虑
情况1: 昨天买了,今天卖 dp[i-1][1] - (-prices[i]) 情况2: 昨天买了,今天不卖 dp[i-1][1] 情况3: 昨天卖了,今天买 dp[i-1][0] + (-prices[i]) 情况4: 昨天卖了,今天不买 dp[i-1][0] 问题1: 今天没买?取决于 :a.昨天买的今天卖了,b.昨天没买,今天也没买 a,b算一下哪个挣钱多 问题2: 今天买了?取决于: a.昨天买的今天没卖,b.昨天没买,今天买了 a,b算一下哪个挣钱多
public static int maxProfit(int[] prices) {
int dp[][] = new int[prices.length][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
/**
* 状态1: 昨天买了,今天卖 dp[i-1][1] - (-prices[i])
* 装态2: 昨天买了,今天不卖 dp[i-1][1]
* 状态3: 昨天卖了,今天买 dp[i-1][0] + (-prices[i])
* 状态4: 昨天卖了,今天不买 dp[i-1][0]
* 问题1: 今天没买取决于 :a.昨天买的今天卖了,b.昨天没买,今天也没买 a,b算一下哪个挣钱多
* 问题2: 今天买了取决于: a.昨天买的今天没卖,b.昨天没买,今天买了 a,b算一下哪个挣钱多
*/
for (int i = 1; i < prices.length; i++) {
//今天手里没有股票 ——>1. 昨天没买。2.昨天买了,今天卖了
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
//今天手里有票,——> 1.昨天卖了,今天买了 2.昨天买了,今天没买
dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
}
//最后返回的肯定是卖了以后的
return dp[dp.length - 1][0];
}