题目

 
global[new_scroll][j] = max(local[new_scroll][j], global[old_scroll][j]);

实现

class Solution {
public:
	int maxProfit(int k, vector<int> &prices) {
	    int n = prices.size();
	    if(n <= 1)
	        return 0;
	    if(k >= n)
	        return maxProfit2(prices);
	    for(int i = 0; i < 2; i ++){
	        local[i].assign(k + 1, 0);
	        global[i].assign(k + 1, 0);
	    }
	    int old_scroll = 0, new_scroll;
	    for(int i = 1; i < n; i ++){
	        int diff = prices[i] - prices[i-1];
	        new_scroll = 1 - old_scroll;
	        for(int j = 1; j <= k; j ++){
	            local[new_scroll][j] = max(global[old_scroll][j-1] + max(diff, 0), local[old_scroll][j] + diff);
	            global[new_scroll][j] = max(local[new_scroll][j], global[old_scroll][j]); //注意这里 local 为new_scroll
	        }
	        old_scroll = new_scroll;
	    }
	    return global[new_scroll][k];
	}
	int maxProfit2(vector<int>& prices){
	    int result = 0;
	    int n = prices.size();
	    for(int i = 1; i < n; i ++){
	        if(prices[i] > prices[i-1])
	            result += (prices[i] - prices[i-1]);
	    }
	    return result;
	}
private:
    vector<int> local[2];
    vector<int> global[2];
};

 

相关文章: