188. 买卖股票的最佳时机 IV(困难)

思路:

与之前的股票问题不同的是,这里设置三维数组的dp,动态规划

 

代码:

class Solution {
    public int maxProfit(int k, int[] prices) {
		int n=prices.length;
		int[][][] dp=new int[n][k][2];
		if(n<2||k==0) return 0;
		
		//n表示下标,k表示第几笔交易,2表示状态
		//只有2种状态
		//不持股(0)
		//持股(1)
		
		//初始化持股的情况,状态0的初始化放在核心代码里一起,就不会浪费循环时间了
		for(int i=0;i<n;i++){
			for(int j=0;j<k;j++){
				dp[i][j][1]=Integer.MIN_VALUE;
			}
		}
		
		//要分别判断i==0与j==0时的情况
		//i==0代表第一个元素初始化
		//j==0代表第一笔交易初始化
		for(int i=0;i<n;i++){
			for(int j=0;j<k;j++){
				if(i==0){
					dp[i][j][0]=0;
					dp[i][j][1]=-prices[0];
				}else{
					if(j==0){
						dp[i][j][1]=Math.max(dp[i-1][j][1],-prices[i]);
					}else{
                        dp[i][j][1]=Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
						
					}
					dp[i][j][0]=Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
				}
			}
		}
		
		return dp[n-1][k-1][0];
		
    }
}

 

分解:

1)三维数组dp:

int[][][] dp=new int[n][k][2];

n:哪个元素

k:第几笔交易

2:2种状态:(0不持股,1持股)

 

2)初始化持股的情况即可,状态0不持股的初始化放在核心代码里一起,就不会浪费循环时间了

 

3)核心代码中,分i==0和j==0的情况:

i)i==0起始就是初始化第一个元素

ii)j==0 主要是dp[][][1]的情况,持股的情况

因为持股的前一个状态是不持股,前一个的不持股与当前的持股是不同的交易笔数

 

4)注意n<2||k==0的判空

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值