Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most two transactions.
Note:
 You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
 
解题思路:
题目规定最多两次交易,而不一定是两次交易。若为一次交易可以视为在中间某一天卖出有买进。
动态规划形式化分析:
设状态函数 f(i) 表示数组下标区间[0,i] 的最大利润; 状态函数g(i) 表示数组下标区间[i,n-1]的最大利润; 其中 0<= i <= n-1 。
则最终答案为max{ f(i) + g(i) }, 0<= i <= n-1。
 
状态函数f(i) 的转换函数为: f(i) = max( f(i-1), prices[i] - curMin); //curMin 表示prices数组0 - (i-1) 下标中值的最小值。
状态函数f(i) 的转换函数为: g(i) = max( g(i+1), curMax-prices[i]); //curMax 表示prices数组i - (n-1) 下标中值的最大值。
 
备注:
若将原数组变成差分数组,本题就可以看做是最大m子段和(其中m=2)的问题。
 
 
程序源代码:
Java源代码:
 
    public int maxProfit(int[] prices) {
        if (prices.length < 2) {
			return 0;
		}
		int[] f = new int[prices.length];
		f[0]=0;
		for (int i = 1, curMin = prices[0]; i < prices.length; ++i) {
				f[i]=Math.max(prices[i]-curMin, f[i-1]); 
				curMin = Math.min(curMin, prices[i]);    
		}
		int[] g= new int[prices.length];
		g[prices.length-1]=0;
		for(int i=prices.length-2,curMax=prices[prices.length-1]; i>-1; --i){
			g[i]=Math.max(g[i+1], curMax-prices[i]);
			curMax= Math.max(curMax, prices[i]);
		}
		int maxProfit = 0;
		for( int i=0; i<prices.length; ++i){
			maxProfit = Math.max(maxProfit, f[i]+g[i]);
		}
		return maxProfit;
	}
 
 
附录:
相关题目:
LeetCode--Best Time to Buy and Sell Stock (贪心策略 or 动态规划)
 
LeetCode -- Best Time to Buy and Sell Stock II (贪心策略,差分序列)
 
 
 
                  
                  
                  
                  
                            
                            
本文深入探讨了在股市中利用动态规划算法寻找最多完成两次交易的最佳时机,以实现最大利润。通过定义状态函数f(i)和g(i),我们可以计算出在任意给定日期买入和在另一日期卖出的最优策略。最后,通过遍历数组并求和f(i)+g(i),找到总最大利润。此外,文章还提示读者如何将问题简化为最大m子段和问题,并提供了Java源代码实现。
          
      
          
                
                
                
                
              
                
                
                
                
                
              
                
                
              
            
                  
					532
					
被折叠的  条评论
		 为什么被折叠?
		 
		 
		
    
  
    
  
            


            