- 原题链接:121. 买卖股票的最佳时机
1- 思路
动规五部曲
- 1- 初始化 dp 数组以及其含义
- dp[i][0]:第 i 天持有股票
- dp[i][1]:第 i 天卖出股票
- 2- 递推公式
- dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
- dp[i][1]:Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
- 3- 初始化
- dp[i][0] = -prices[0];
- 4- 遍历顺序
2- 实现
⭐121. 买卖股票的最佳时机——题解思路
:::info
- 1- 初始化 dp 数组以及其含义
dp[i][0]
:第i
天持有股票dp[i][1]
:第i
天卖出股票
- 2- 递推公式
dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
dp[i][1]:Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
- 3- 初始化
dp[i][0] = -prices[0];
- 4- 遍历顺序
:::
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int[][] dp = new int[len][2];
// 2.递推公式
// dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
// dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
// 初始化
dp[0][0] = -prices[0];
// 4. 遍历顺序
for(int i = 1 ; i < len;i++){
dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
}
return dp[len-1][1];
}
}
3- ACM 实现
public class maxProfit {
public static int maxP(int[] prices){
// 定义dp
int len = prices.length;
int[][] dp = new int[len][2];
// 2. 递推公式
// dp[i][0] = Math.max(dp[i-1][0],-prices[i]); 有
// dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]); 没有
// 3.初始化
dp[0][0] = -prices[0];
for(int i = 1; i < len;i++){
dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return dp[len-1][1];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String[] parts = input.split(" ");
int[] nums = new int[parts.length];
for(int i = 0 ; i < nums.length;i++){
nums[i] = Integer.parseInt(parts[i]);
}
System.out.println("结果是"+maxP(nums));
}
}