int maxProfit(int k, vector<int>& prices) {
     int n = prices.size();
     if(n<1 || k<1)
         return 0;
     if(k > n)
         return maxPro(prices);
     vector<int> global(k+1, 0);
     vector<int> local(k+1, 0);
     for(int i=0; i<n-1; i++)
     {
         int dif = prices[i+1] -prices[i];
         for(int j=k; j>=1; --j)
         {
            local[j] = max(global[j-1]+max(dif, 0), local[j]+dif);
            global[j] = max(global[j], local[j]);
         }
     }
     return global[k];
        
 }
    int maxProfit(int k, vector<int>& prices) {
        if (prices.size() < 2)
            return 0;
        
        if (k >= prices.size() / 2) {
		    int maxPro = 0;
		    for (int i = 1; i < prices.size(); i++)
			    if (prices[i] > prices[i-1])
				    maxPro += prices[i] - prices[i-1];
		    return maxPro;
	    }
        
        vector<vector<int>> maxPro(k+1, vector<int>(prices.size(), 0));
        for (int i = 1; i <= k; i++) {
            for (int j = 1; j != prices.size(); j++) {
                for (int k = 0; k < j; k++)
                    maxPro[i][j] = max(maxPro[i][j], maxPro[i-1][k] + prices[j] - prices[k]);
                maxPro[i][j] = max(maxPro[i][j], maxPro[i][j-1]);
            }
        }
        return maxPro[k][prices.size()-1];
    }