买卖股票的最佳时机
思路分析 :
dp[i][j][0] 表示到第 i 天,交易了 k 支股票,并且手上未持股的最大收益
dp[i][j][1] 表示到第 j 天,交易了 k 支股票,并且手上持股的最大收益
代码分析 :
class Solution { public: int maxProfit(int k, vector<int>& prices) { int dp[1005][105][2]; memset(dp, 0, sizeof(dp)); int n = prices.size(); dp[0][0][0] = 0; dp[0][0][1] = -999999; // printf("n = %d \n", n); prices.push_back(0); for(int i = n; i > 0; i--) prices[i] = prices[i-1]; for(int i = 1; i <= n; i++) { dp[i][0][0] = 0; dp[i][0][1] = max(-prices[i], dp[i-1][0][1]); } for(int i = 1; i <= k; i++) dp[0][i][0] = dp[0][i][1] = -9999999; for(int i = 1; i <= n; i++){ for(int j = 1; j <= k; j++){ dp[i][j][0] = max(dp[i-1][j-1][1]+prices[i], dp[i-1][j][0]); dp[i][j][1] = max(dp[i-1][j][0]-prices[i], dp[i-1][j][1]); } } int ans = 0; for(int i = 1; i <= k; i++){ ans = max(ans, dp[n][i][0]); // ans = max(ans, dp[n][i][1]); } return ans; } };
东北日出西边雨 道是无情却有情