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

Split Array รวมที่ใหญ่ที่สุดใน C ++


สมมติว่าเรามีอาร์เรย์ของจำนวนเต็มบวกและหนึ่งค่า m เราสามารถแบ่งอาร์เรย์นี้เป็นอาร์เรย์ย่อยที่อยู่ติดกันจำนวน m เราต้องคิดค้นอัลกอริทึมเพื่อลดผลรวมที่ใหญ่ที่สุดในบรรดาอาร์เรย์ย่อย m เหล่านี้

ดังนั้นถ้าอาร์เรย์คือ [7,2,4,10,9] และ m =2 ผลรวมจะเท่ากับ 19 เนื่องจากเราสามารถสร้างอาร์เรย์ย่อยสองชุดได้ เช่น [7,2,4] และ [10,9] จากนั้นอาร์เรย์ย่อยที่มีผลรวมมากที่สุดคือ 19

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน splitArray() ซึ่งจะใช้อาร์เรย์ v, m,
  • n :=ขนาดของวี
  • สร้างขนาดอาร์เรย์หนึ่ง dp
  • สร้างผลรวมอาร์เรย์อื่นของขนาด n
  • sum[0] :=v[0]
  • สำหรับการเริ่มต้น i :=1 เมื่อฉัน
  • sum[i] :=sum[i - 1] + v[i]
  • dp[0] :=sum[n - 1]
  • สำหรับการเริ่มต้น i :=1 เมื่อฉัน
  • dp[i] :=sum[n - 1] - sum[i - 1]
  • สำหรับการเริ่มต้น i :=1 เมื่อฉัน
  • สำหรับการเริ่มต้น start :=0, when start
  • สำหรับการเริ่มต้น end :=start + 1 เมื่อสิ้นสุด <=n - i อัปเดต (เพิ่มจุดสิ้นสุดทีละ 1) ทำ -
  • dp[start] :=ต่ำสุดของ dp[start] และสูงสุดของ (sum[end - 1] เมื่อ start เป็น 0 มิฉะนั้น sum[end - 1] - sum[start - 1]) และ dp[end]
  • ผลตอบแทน dp[0]
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       int splitArray(vector<int>& v, int m) {
          int n = v.size();
          vector <long long int > dp(n);
          vector <long long int> sum(n);
          sum[0] = v[0];
          for(int i =1;i<n;i++)sum[i] =sum[i-1]+v[i];
          dp[0] = sum[n-1];
          for(int i =1;i<n;i++){
             dp[i] = sum[n-1] - sum[i-1];
          }
          for(int i =1;i<m;i++){
             for(int start = 0;start<n-i;start++){
                for(int end = start+1;end<=n-i;end++){
                   dp[start] = min(dp[start],max((start==0?sum[end-1]:sum[end-1]-sum[start-1]),dp[end]));
                }
             }
          }
          return dp[0];
       }
    };
    main(){
       Solution ob;
       vector<int> v = {7,2,4,10,9};
       cout << (ob.splitArray(v, 2));
    }

    อินพุต

    [7,2,4,10,9]
    2

    ผลลัพธ์

    19