题意理解:
给你一个整数数组
prices
和一个整数k
,其中prices[i]
是某支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成
k
笔交易。也就是说,你最多可以买k
次,卖k
次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
这道题的特别之处是,最多可以买卖k次,k是一个可以变化的值,所以使用j对k的数值进行遍历。
解题思路:
(1)定义dp二维[][]数组
dp[0][0]表示不操作
dp[i][j=2(k-1)+1]表示第k次买入
dp[i][j=2(k-1)+2]表示第k次卖出
(2) 初始化
dp[0][0]=0
dp[0][j=2(k-1)+1]=-prices[i]
dp[0][j=2(k-1)+2]=0
(3) 递推公式
dp[i][j=2(k-1)+1]
=max(延续之前状态,买入)
=max(dp[i-][j=2(k-1)+1],dp[i-1][j=2(k-1)]-prices[i])
dp[i][j=2(k-1)+2]=-prices[i]
=max(延续之前状态,卖出)
=max(dp[i-][j=2(k-1)+2],dp[0-1][j=2(k-1)+1]+prices[i])
1.解题
public int maxProfit(int k, int[] prices) {
int[][] dp=new int[prices.length][2*k+1];
for(int i=0;i<=2*k;i++){
if(i%2==0)
dp[0][i]=0;
else dp[0][i]=-1*prices[0];
}
for(int i=1;i<prices.length;i++){
dp[i][0]=dp[i-1][0];
for(int j=0;j<2*k;j+=2){
dp[i][j+1]=Math.max(dp[i-1][j+1],dp[i-1][j]-prices[i]);
dp[i][j+2]=Math.max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);
}
}
int max=0;
for(int i=0;i<=2*k;i++)
max=Math.max(max,dp[prices.length-1][i]);
return max;
}
2.分析
时间复杂度:O(kn)
空间复杂度:O(2kn)