Advertisement
alisadafi

Reverse-Operation-D&C

Nov 17th, 2023 (edited)
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.30 KB | None | 0 0
  1. def maxCrossingSum(arr, l, m, r):
  2.     sm = 0
  3.     left_sum = -float('inf')
  4.  
  5.     for i in range(m, l - 1, -1):
  6.         sm = sm + arr[i]
  7.  
  8.         if (sm > left_sum):
  9.             left_sum = sm
  10.  
  11.     sm = 0
  12.     right_sum = -float('inf')
  13.     for i in range(m, r + 1):
  14.         sm = sm + arr[i]
  15.  
  16.         if (sm > right_sum):
  17.             right_sum = sm
  18.  
  19.     return max(left_sum + right_sum - arr[m], left_sum, right_sum)
  20.  
  21.  
  22. def maxSubArraySum(arr, l, r):
  23.     if (l > r):
  24.         return -float('inf')
  25.     if (l == r):
  26.         return arr[l]
  27.  
  28.     m = (l + r) // 2
  29.  
  30.     return max(maxSubArraySum(arr, l, m - 1),
  31.                maxSubArraySum(arr, m + 1, r),
  32.                maxCrossingSum(arr, l, m, r))
  33.  
  34.  
  35. def reverse_operation(arr, n):
  36.     b_1 = []
  37.     for i in range(1, n, 2):
  38.         b_1.append(arr[i] - arr[i - 1])
  39.     b_2 = []
  40.     for i in range(1, n - 1, 2):
  41.         b_2.append(arr[i] - arr[i + 1])
  42.  
  43.     change = max(maxSubArraySum(b_1, 0, len(b_1) - 1), maxSubArraySum(b_2, 0, len(b_2) - 1))
  44.     even_sum = 0
  45.     for i in range(n):
  46.         if i % 2 == 0:
  47.             even_sum += arr[i]
  48.  
  49.     return even_sum + max(0, change)
  50.  
  51.  
  52. def main():
  53.     n = int(input())
  54.     arr = list(map(int, input().split()))
  55.     print(reverse_operation(arr, n))
  56.  
  57.  
  58. if __name__ == "__main__":
  59.     main()
  60.  
Tags: D&C
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement