买卖股票有手续费与含冷冻期【贪心算法】【动态规划 】

题目:给定⼀个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;⾮负整数 fee 代表了交易股票的⼿续费⽤。
你可以⽆限次地完成交易,但是你每笔交易都需要付⼿续费。如果你已经购买了⼀个股票,在卖出它之前你就不能
再继续购买股票了。
返回获得利润的最⼤值。

let prices = [8, 4, 3, 1, 3, 2, 8, 100, 4, 9, 1, -1, -2];
fee = 2;

prices.push(0); //push一个是为了方便计算ep - tmin的差值
let tmin = prices[0];
let res = 0;
for (let i = 1; i < prices.length; i++) {
  const e = prices[i];
  const ep = prices[i - 1];
  if (e < ep) {
    if (ep - tmin > fee) {
      res += ep - tmin;
    }
    tmin = e;
  }
}

console.log(res);

贪心思路是在突然价格降低之前卖出,重置最小值,加上降低之前的差值。

let prices = [8, 4, 3, 1, 3, 4, 2, 8, 100, ],
    fee = 2
let dp = new Array(prices.length).fill(0).map(() => new Array(2).fill(0))
dp[0] = [-prices[0], 0] //假设一开始就买进 那么最开始的有股票的时候利润为负数,卖出去的利润为零
// 声明dp初始化意义 :dp[i][0]为拥有股票的最大利润 dp[i][1]为没有股票的最大利润
for (let i = 1; i < prices.length; i++) {
    const t = dp[i - 1][1] - prices[i] - fee
    dp[i][0] = t > 0 ? dp[i - 1][0] : Math.max(dp[i - 1][0], t)
    dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i])

}

console.log(dp);

动态规划方式就不在纠结那天买的问题 而是以每一天的状态来确定当天的最大利润

let prices = [8, 4, 3, 1, 100, 2, 2, 8, 100, ],
    fee = 2
let dp = new Array(prices.length).fill(0).map(() => new Array(2).fill(0))
dp[0] = [-prices[0], 0] //假设一开始就买进 那么最开始的有股票的时候利润为负数,卖出去的利润为零
// 声明dp初始化意义 :dp[i][0]为拥有股票的最大利润 dp[i][1]为没有股票的最大利润
dp[1] = [-prices[1], 0] 
   
for (let i = 2; i < prices.length; i++) {
    const t = dp[i - 1][1] - prices[i]-fee
    dp[i][0] = Math.max(dp[i - 1][0], t) //买的话可以买当天的 因为考虑了前天没有的情况
    dp[i][1] = Math.max(dp[i - 1][1], dp[i - 2][0] + prices[i]) //卖只能卖隔天的

}

console.log(dp);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值