买卖股票相关的第四道题了,还是动态规划算法,只是多了一个手续费,个人感觉把手续费放在买股票时计算比较好理解。
package likou;
/*
* 买卖股票的最佳时机含手续费
* 题干:
* 给定一个整数数组prices,其中第i个元素代表了第i天的股票价格
* 整数fee代表了交易股票的手续费用
* 你可以无限次地完成交易,但是你每笔交易都需要付手续费
* 如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了
* 返回获得利润的最大值
* tip:一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费
*/
public class Demo714 {
/*
* 解题思路:
* 假设股票价格数组为prices,交易费用为fee
* 虽然可以无数次交易,但最多也是每天交易一次,每天结束后手里只有两种状态持有股票或不持有
* 假设每天结束后手上持有股票收益为dp0,不持有股票收益为dp1,假设手续费在买股票时扣除
* 假设第i天结束后,如果手上持有股票,则可能是第i-1天手上持有股票
* 或者第i-1天手上没有股票,但i天购入,则dp0[i]=Math.max(dp0[i-1],dp1[i-1]-prices[i]-fee)
* 假设第i天结束后,如果手上不持有股票,则可能是第i-1天持有,第i天卖出
* 或者第i-1天就不持有股票,则dp1[i] = Math.max(dp0[i-1]+prices[i],dp1[i-1])
*/
public int maxProfit(int[] prices, int fee) {
int dp0 = -prices[0]-fee;
int dp1 = 0;
int length = prices.length;
for(int i=1;i<length;i++) {
int tempdp0 = Math.max(dp0, dp1-prices[i]-fee);
int tempdp1 = Math.max(dp0+prices[i], dp1);
dp0 = tempdp0;
dp1 = tempdp1;
}
return Math.max(dp1, dp0);
}
public static void main(String args[]) {
Demo714 demo = new Demo714();
int[] prices = {1, 3, 2, 8, 4, 9};
int fee = 2;
System.out.println(demo.maxProfit(prices, fee));
}
}