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