1 #include <iostream> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 6 const int Maxlen=1e5; 7 int prices[Maxlen]; 8 int n,k; 9 10 int quickSolve(){ 11 //as long as there is a price gap ,we gain a profit 12 int profit=0; 13 for(int i=1;i<n;i++) 14 if(prices[i] > prices[i-1]) profit+=prices[i]-prices[i-1]; 15 return profit; 16 } 17 18 int MaxProfit(){ 19 int i,j; 20 if(n == 0) 21 return 0; 22 else if(n/2 < k) 23 return quickSolve();//避免k过大所引起的超时的问题 24 int buy[Maxlen],sell[Maxlen]; 25 for(i=0;i<n;i++){ 26 buy[i]=-0x3f3f3f; 27 sell[i]=0; 28 } 29 //初始化 30 31 for(i=0;i<n;i++){ 32 for(j=1;j<=k;j++){ 33 buy[j]=max(buy[j],sell[j-1]-prices[i]); 34 sell[j]=max(sell[j],buy[j]+prices[i]); 35 } 36 } 37 return sell[k]; 38 } 39 40 41 int main(){ 42 43 //依然是股票交易问题 但是至多只能交易k次 44 //使用的核心算法是动态规划 45 //核心思路是用两个数组buy和sell分别表示第i次买入交易的最大收益和第i次卖出的最大收益知 46 //DP状态转移方程 47 //buy[j]=max(buy[j] , sell[j-1] - prices[i] );//在第i点处进行第j次买入交易 48 //sell[j]=max(sell[j],buy[j]+prices[i]);//在第i点处进行第j次卖出交易 49 //此时,用quicksolve函数来解决若k太大引起的超时问题,简化到允许到多次交易的问题 50 int i,j; 51 while(~scanf("%d %d",&n,&k)){ 52 for(i=0;i<n;i++) 53 scanf("%d",&prices[i]); 54 printf("%d ",MaxProfit()); 55 } 56 return 0; 57 }