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

ผลรวมเฉลี่ยที่ใหญ่ที่สุดใน C ++


สมมติว่าเราแบ่งแถวของตัวเลข A ออกเป็น K กลุ่มที่อยู่ติดกันมากที่สุด จากนั้นเราจะกำหนดคะแนนเป็นผลรวมของค่าเฉลี่ยของแต่ละกลุ่ม เราต้องพบว่าอะไรคือคะแนนสูงสุดที่เราจะทำได้ สมมติว่า A =[9,1,2,3,9] และ K คือ 3 ผลลัพธ์จะเป็น 20 เนื่องจากตัวเลือกที่ดีที่สุดคือการแบ่ง A เป็น [9], [1, 2, 3] [9]. คำตอบคือ 9 + (1 + 2 + 3) / 3 + 9 =20 เราอาจแบ่ง A ออกเป็น [9, 1], [2], [3, 9],

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

  • กำหนดเมทริกซ์ dp
  • กำหนดวิธีการแบบเรียกซ้ำแก้ปัญหา () ซึ่งจะใช้อาร์เรย์ A ดัชนีและ k
  • ถ้า index>=size ของ A ให้คืนค่า 0
  • ถ้า k เป็น 0 ให้คืนค่า -100000
  • ถ้า dp[index, k] ไม่ใช่ – 1 ให้คืนค่า dp[index, k]
  • ret :=-inf และ sum :=0
  • สำหรับฉันอยู่ในช่วงดัชนีถึงขนาด A – 1
    • sum :=sum + A[i]
    • ret :=สูงสุดของ ret และ sum/(i – ดัชนี + 1) + แก้ (A, i + 1, k – 1)
  • set dp[index, k] :=ret and return.
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • n :=ขนาดของ A
  • dp :=เมทริกซ์ n x (K + 1) เติมด้วย – 1
  • ผลตอบแทนแก้(A, 0, K)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   vector < vector <double> > dp;
   double solve(vector <int>& A, int idx, int k){
      if(idx >= A.size()) return 0;
      if(!k) return -100000;
      if(dp[idx][k] != -1) return dp[idx][k];
      double ret = INT_MIN;
      double sum = 0;
      for(int i = idx; i < A.size(); i++){
         sum += A[i];
         ret = max(sum / (i - idx + 1) + solve(A, i + 1, k - 1), ret);
      }
      return dp[idx][k] = ret;
   }
   double largestSumOfAverages(vector<int>& A, int K) {
      int n = A.size();
      dp = vector < vector <double> > (n, vector <double>(K + 1, -1));
      return solve(A, 0, K);
   }
};
main(){
   vector<int> v = {9,1,2,3,9};
   Solution ob;
   cout << (ob.largestSumOfAverages(v, 3));
}

อินพุต

[9,1,2,3,9]
3

ผลลัพธ์

20