ধরুন আমরা পূর্ণসংখ্যা A এর একটি অ্যারে দিয়েছি এবং n হল অ্যারের দৈর্ঘ্য। এখন ধরে নিন Bk অ্যারে A, k অবস্থান ঘড়ির কাঁটা অনুসারে ঘোরানোর মাধ্যমে প্রাপ্ত একটি অ্যারে। এখানে ঘূর্ণনকে −
হিসাবে সংজ্ঞায়িত করা যেতে পারে-
F(k) =0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]।
এখন F(0), F(1), ..., F(n-1) এর সর্বোচ্চ মান খুঁজুন।
সুতরাং ইনপুট যদি A =[4,3,2,6] এর মত হয়, তাহলে −
-
F(0) =(0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) =0 + 3 + 4 + 18 =25
-
F(1) =(0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) =0 + 4 + 6 + 6 =16
-
F(2) =(0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) =0 + 6 + 8 + 9 =23
-
F(3) =(0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) =0 + 2 + 12 + 12 =26
সর্বোচ্চ 26।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n :=অ্যারের আকার, যদি n 0 হয়, তাহলে 0 ফেরত দিন
-
ret :=0, n আকারের দুটি অ্যারে তৈরি করুন, এগুলি ডান এবং বাম
-
বাম[0] :=A[0]
-
1 থেকে n – 1
রেঞ্জের জন্য i-
left[i] :=left[i] + left[i – 1]
-
left[i] :=left[i] + A[i]
-
-
ডান [n – 1] :=A[n – 1]
-
i রেঞ্জ n – 1 থেকে 0
পর্যন্ত-
right[i] :=right[i] + right[i + 1]
-
right[i] :=right[i] + A[i]
-
-
rightMul :=0, cnt :=n – 1
-
i রেঞ্জ n – 1 থেকে 1
এর মধ্যে-
rightMul :=rightMul + A[i] * cnt
-
cnt 1 দ্বারা হ্রাস করুন
-
-
n
আকারের একটি অ্যারে x তৈরি করুন -
0 থেকে n – 2
রেঞ্জের i জন্য-
x[i] :=rightMul
-
rightMul :=rightMul – right[i + 1]
-
-
leftMul :=0, cnt :=1
-
i এর জন্য রেঞ্জ 0 থেকে n – 2
-
leftMul :=leftMul + A[i] * cnt
-
cnt 1 দ্বারা বাড়ান
-
-
cnt 1 দ্বারা হ্রাস করুন
-
i রেঞ্জ n – 1 থেকে 1
এর মধ্যে-
x[i] :=x[i] + leftMul
-
leftMul :=leftMul – A[i – 1] * cnt
-
যদি i – 2>=0, তারপর leftMul :=leftMul + left[i – 2]
-
-
x
এর সর্বোচ্চ রিটার্ন
উদাহরণ (C++)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int maxRotateFunction(vector<int>& A) { lli n = A.size(); if(n == 0) return 0; lli ret = 0; vector <lli>right(n); vector <lli> left(n); left[0] = A[0]; for(lli i = 1; i < n; i++){ left[i] += left[i - 1]; left[i] += A[i]; } right[n - 1] = A[n - 1]; for(lli i = n - 2; i >= 0; i--){ right[i] += right[i + 1]; right[i] += A[i]; } lli rightMul = 0; lli cnt = n - 1; for(lli i = n - 1; i > 0; i--){ rightMul += (A[i] * cnt); cnt--; } vector <lli> x(n); for(lli i = 0; i < n - 1; i++){ x[i] = rightMul; rightMul -= right[i + 1]; } lli leftMul = 0; cnt = 1; for(lli i = 0; i < n - 1; i++){ leftMul += A[i] * cnt; cnt++; } cnt--; for(lli i = n - 1; i >= 1; i--){ x[i] += leftMul; leftMul -= (A[i - 1] * cnt); if(i - 2 >= 0) leftMul += left[i - 2]; } ret = INT_MIN; for(lli i = 0; i < x.size(); i++) ret = max(ret, x[i]); return ret; } }; main(){ Solution ob; vector<int> v = {4,3,2,6}; cout <<(ob.maxRotateFunction(v)); }
ইনপুট
[4,3,2,6]
আউটপুট
26