股票买卖问题

股票问题

labuladong团灭股票问题
此类问题本质可看作动态规划问题,分为天数,最大交易数,是否持有三种状态,重点就是找到三种状态的更新规律,然后穷举遍历所有状态,比较多个选择取最优解。
股票问题714
穷举框架
穷举框架
股票问题状态方程与初始值
股票问题状态方程与初始值

714.带手续费的股票买卖
算法代码

class test714 {
    public int maxProfit(int[] prices, int fee) {
        /*
        i=天数,k=最大交易数,0/1代表是否还有股票
        状态方程(当天持有和不持有两种):
        dp[i][k][0]=Math.max(dp[i-1][k][0],dp[i-1][k][1]+prices[i]);
        dp[i][k][1]=Math.max(dp[i-1][k][1],dp[i-1][k-1][0]-prices[i]);
        初始值:
        dp[-1][k][1]=Integer.MIN_VALUE;
        dp[-1][k][0]=0;
        dp[i][0][1]=Integer.MIN_VALUE;
        dp[i][0][0]=0;
         */
       int n=prices.length;
       //int dp[][][]=new int[n][k+1][2];
       //给定初始值
       int dp_ik_0=0;
       int dp_ik_1=Integer.MIN_VALUE;
       for (int i=0;i<n;i++){
           int temp=dp_ik_0;
           //无限次交易(或交易k=1次时k也不起作用)时上述注释状态方程中k与k-1近似,所有k不起作用,省略k
           //但是k=2(此时k起作用不能省略要遍历)或任意整数时(考虑溢出,k最大为n/2,因为每天只能选择一种交易方式)
           dp_ik_0=Math.max(dp_ik_0,dp_ik_1+prices[i]);
           //有手续费时假设买入时交手续费(另一种卖出后第二天才能买入的此时的temp是前天的利润)
           dp_ik_1=Math.max(dp_ik_1,temp-prices[i]-fee);
       }
        return dp_ik_0;
    }
}

测试用主函数

public class model6 {
    public static void main(String[] args) {
        test714 test714 = new test714();
        System.out.println(test714.maxProfit(new int[]{1, 2, 8, 2, 8, 5}, 2));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值