Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ผลรวมของ subarray สูงสุดในอาร์เรย์ที่สร้างขึ้นหลังจากการต่อซ้ำใน C++ Program


ในปัญหานี้ เราได้รับอาร์เรย์ arr[] ขนาด n และจำนวนเต็ม k งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมของอาร์เรย์ย่อยสูงสุดในอาร์เรย์ที่สร้างขึ้นหลังจากการต่อกันซ้ำๆ

คำอธิบายปัญหา − เราจะหาผลรวมสูงสุดของ subarray ที่นำมาจากอาร์เรย์ที่สร้างขึ้นหลังจาก arr ซ้ำ k ครั้ง

ตัวอย่าง

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

อินพุต

arr[] = {−9, −5, 14, 6} k = 2

ผลลัพธ์

26

คำอธิบาย

New array after repeating : {−9, −5, 14, 6, −9, −5, 14, 6}
Subarray with maximum sum = {14, 6, −9, −5, 14, 6}
Sum = 26

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาง่ายๆ คือ การสร้างอาร์เรย์ใหม่ที่จะเกิดขึ้นหลังจากการต่อ arr[], k เวลา แล้วค้นหาอาร์เรย์ย่อยที่มีผลรวมสูงสุด สำหรับวิธีนี้ วิธีที่ดีที่สุดคือการใช้อัลกอริทึมของ Kadane

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int newArr[2*n];
   for(int i = 0; i < k*n; i++)
   newArr[i] = arr[i%n];
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + newArr[i];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

ผลลัพธ์

The maximum subarray sum in an array created after repeated
concatenation is 26

วิธีนี้เป็นวิธีที่ดีแต่เป็นวิธีที่มีประสิทธิภาพมากกว่าในการแก้ปัญหานั้นสามารถทำได้โดยใช้เลขคณิตแบบแยกส่วน

เลขคณิตแบบแยกส่วน คือเวลาที่เราใช้ตัวดำเนินการโมดูโลเพื่อหาส่วนที่เหลือของสมการ

ในการแก้ปัญหา เราจะใช้เลขคณิตแบบแยกส่วนแทนการสร้าง thearray โดยการต่อกันซ้ำๆ วิธีการพักผ่อนยังคงเหมือนเดิม

ตัวอย่าง

โปรแกรมเพื่ออธิบายการทำงานของโซลูชันของเรา

#include <iostream>
using namespace std;
int calcMaxSubArraySum(int arr[], int n, int k){
   int maxSum = −1000, sum = 0;
   for (int i = 0; i < k*n; i++) {
      sum = sum + arr[i%n];
      if (maxSum < sum)
         maxSum = sum;
      if (sum < 0)
         sum = 0;
   }
   return maxSum;
}
int main(){
   int arr[] = { −9, −5, 14, 6 };
   int k = 2;
   int n = sizeof(arr) / sizeof(arr[0]);
   cout<<"The maximum subarray sum in an array created after
   repeated concatenation is "<<calcMaxSubArraySum(arr, n, k);
   return 0;
}

ผลลัพธ์

The maximum subarray sum in an array created after repeated
concatenation is 26