From 2ffbe3fff99942b4338b5dd90c09d6b34e75db05 Mon Sep 17 00:00:00 2001 From: chayan das <110921638+Chayandas07@users.noreply.github.com> Date: Sat, 28 Dec 2024 19:41:32 +0530 Subject: [PATCH] Create 689. Maximum Sum of 3 Non-Overlapping Subarrays --- ...Maximum Sum of 3 Non-Overlapping Subarrays | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 689. Maximum Sum of 3 Non-Overlapping Subarrays diff --git a/689. Maximum Sum of 3 Non-Overlapping Subarrays b/689. Maximum Sum of 3 Non-Overlapping Subarrays new file mode 100644 index 0000000..107ab2c --- /dev/null +++ b/689. Maximum Sum of 3 Non-Overlapping Subarrays @@ -0,0 +1,62 @@ +class Solution { +public: + void subarraySum(vector& nums, vector& subarr, int k) { + int n = nums.size(); + int l = 0; + int r = 0; + int sum = 0; + + while (r < n) { + while (r - l + 1 < k) { + sum += nums[r]; + r++; + } + sum += nums[r]; + subarr.push_back(sum); + sum -= nums[l]; + l++; + r++; + } + }; + + int helper(int ind, vector& subarr, int k, int count, + vector>& dp) { + int n = subarr.size(); + if (count == 0) + return 0; + if (ind >= n) + return INT_MIN; + if (dp[ind][count] != -1) + return dp[ind][count]; + int take = subarr[ind] + helper(ind + k, subarr, k, count - 1, dp); + int nottake = helper(ind + 1, subarr, k, count, dp); + return dp[ind][count] = max(take, nottake); + } + void solve(int ind, int count, vector& ans, vector& subarr, int k, + vector>& dp) { + int n = subarr.size(); + if (count == 0) + return; + if (ind >= n) + return; + + int take = subarr[ind] + helper(ind + k, subarr, k, count - 1, dp); + int nottake = helper(ind + 1, subarr, k, count, dp); + + if (take >= nottake) { + ans.push_back(ind); + solve(ind + k, count - 1, ans, subarr, k, dp); + } else + solve(ind + 1, count, ans, subarr, k, dp); + } + + vector maxSumOfThreeSubarrays(vector& nums, int k) { + int n = nums.size(); + vector subarr; + subarraySum(nums, subarr, k); + vector> dp(n + 1, vector(4, -1)); + vector ans; + solve(0, 3, ans, subarr, k, dp); + return ans; + } +};