リンク
タイトル説明
思考
[問題のGM原液]
状態遷移方程式見つける
とベースケース
この問題は、注意が必要で、kはタイムアウト場合、総会で
あればK> N / 2は、無制限の取引と同等であろう
public int maxProfit(int k, int[] prices) {
if(prices == null || prices.length == 0){
return 0;
}
int n = prices.length;
if(k > n/2){
return maxProfit(prices);
}
int[][][] dp = new int[n][k+1][2];
for(int i = 0; i < n;i++){
for(int j = 1 ; j < k+1 ;j++ ){
//base case
if(i-1 == -1){
//max(0,-infinity);
dp[i][j][0] = 0;
//max(-infinity,-prices[i]);
//dp[i][0][1] = -prices[i];
//max(-infinity,-prices[i]);
dp[i][j][1] = -prices[i];
continue;
}
if(j == 1){
dp[i][j][0] = Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);;
dp[i][j][1] = Math.max(dp[i-1][j][1],-prices[i]);
}
dp[i][j][0] = Math.max(dp[i-1][j][0],dp[i-1][j][1]+prices[i]);
dp[i][j][1] = Math.max(dp[i-1][j][1],dp[i-1][j-1][0]-prices[i]);
}
}
return dp[n-1][k][0];
}
private int maxProfit(int[] prices) {
if(prices == null || prices.length == 0){
return 0;
}
int maxProfit = 0;
for(int i = 0; i < prices.length-1; i++){
if(prices[i+1] > prices[i]){
maxProfit += prices[i+1]-prices[i];
}
}
return maxProfit;
}