1 题目
编程题:下面的数组代表着苹果期货在 9 天内的价格变化,其中第 n 个元素是苹果在第 n 天的
价格,你可以进行最多三次交易,设计一个算法,9 天内如何赚到最多的钱?价格数组: [8, 9, 2, 5,
4, 7, 1, 3, 6]
提醒:
1.一天内多次买入卖出,等同于不赚不赔,但消耗次数;
2.交易差价越大,赚的钱越多;
每次只能交易一次,下一次买入卖出必须在上一次交易之后;
2 解题思路
这个问题可以通过动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示在i天内最多进行三次交易所能获得的最大利润。
状态转移方程可以定义为:
dp[i] = max(dp[i-1], dp[i-2] + prices[i] - prices[i-2], dp[i-3] + prices[i] - prices[i-3])
其中,dp[i-1]表示在i-1天内最多进行三次交易的最大利润,dp[i-2] + prices[i] - prices[i-2]表示在i-2天进行一次交易,
然后在i天进行一次交易的最大利润,dp[i-3] + prices[i] - prices[i-3]表示在i-3天进行一次交易,然后在i天进行一次交易的最大利润。
3 编程实现
package com.test;
public class Test {
public static void main(String[] args) {
int[] prices = {8, 9, 2, 5, 4, 7, 1, 3, 6};
int maxProfit = maxProfit(prices);
System.out.println(maxProfit);
}
public static int maxProfit(int[] prices) {
int n = prices.length;
int[] dp = new int[n];
dp[0] = 0;
dp[1] = 0;
dp[2] = prices[1] - prices[0];
for (int i = 3; i < n; i++) {
dp[i]=getMaxOfThreeNum(dp[i - 1], dp[i - 2] + prices[i] - prices[i - 2], dp[i - 3] + prices[i] - prices[i - 3]);
}
return dp[n-1];
}
/**
* 求三个数中的最大值
* @param a
* @param b
* @param c
* @return a b c 中的最大值
*/
public static int getMaxOfThreeNum(int a,int b,int c){
if(a > b){
if(a > c){
return a;
}else{
return c;
}
}else{
if( b > c){
return b;
}else{
return c;
}
}
}
}