股票兩次買賣最大收益(java)


題目:一個人一天只能進行最多兩次買和兩次賣,並且只有賣了才能繼續買。問一天可以獲得的最大收益,要采用時間復雜度低的實現。

輸入:5 2,4,6,8,10.輸出:8 (2買,10賣) 

輸入:6 10,22,5,75,65,80.輸出:87  (10買,22賣,5買,80賣)

動態規划解決方法:設置數組dp[i][j]表示:prices[i]買入到prices[j]賣出的收益。則得出dp[i][j]為

0 12 -5  65  55 70  
0  0 -17 53  43 58  
0  0   0  70  60 75  
0  0   0   0 -10  5  
0  0   0   0   0  15  
0  0   0   0   0   0 

然后:先找出最大值的位置和買入賣出的時間,題中是75最大,買入i=2,賣出j=5

然后根據買入賣出的時間,算出除此之外時間段的最大值

代碼如下:

 


  
  
  
          
  1. public static int maxProfit(int[] prices, int length) {
  2. int res = 0;
  3. int dp[][] = new int[length][length];
  4. for (int i = 0; i < length - 1; i++) {
  5. for (int j = i + 1; j < length; j++) {
  6. dp[i][j] = prices[j] - prices[i];
  7. System.out.print(dp[i][j] + " ");
  8. }
  9. }
  10. int max = 0;
  11. int ma2 = 0;
  12. int start = 0;
  13. int end = 0;
  14. for (int i = 0; i < length; i++)
  15. for (int j = i + 1; j < length; j++) {
  16. if (dp[i][j] > max) {
  17. max = dp[i][j];
  18. start = i;
  19. end = j;
  20. }
  21. }
  22. System.out.println(start + " " + end + " " + max);
  23. for (int i = 0; i < start; i++)
  24. for (int j = i + 1; j < start; j++) {
  25. if (dp[i][j] > ma2) {
  26. ma2 = dp[i][j];
  27. }
  28. }
  29. if (end < length - 1)
  30. for (int i = end + 1; i < length; i++) {
  31. for (int j = i + 1; j < length; j++) {
  32. if (dp[i][j] > ma2) {
  33. ma2 = dp[i][j];
  34. }
  35. }
  36. }
  37. res = max + ma2;
  38. return res;
  39. }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM