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;}}}
}