Giả sử chúng ta có một mảng các số nguyên dương và một giá trị m. Chúng ta có thể chia mảng này thành m số mảng con liền nhau. Chúng tôi phải nghĩ ra một thuật toán để giảm thiểu tổng lớn nhất trong số m mảng con này.
Vì vậy, nếu mảng được cho là [7,2,4,10,9] và m =2, thì tổng sẽ là 19, vì chúng ta có thể tạo hai mảng con như [7,2,4] và [10,9] , thì mảng con có tổng lớn nhất là 19.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một hàm splitArray (), điều này sẽ nhận một mảng v, m,
- n:=kích thước của v
- tạo một mảng có kích thước dp
- tạo một tổng mảng khác có kích thước n
- sum [0]:=v [0]
- để khởi tạo i:=1, khi i
- sum [i]:=sum [i - 1] + v [i]
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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)); }
Đầu vào
[7,2,4,10,9] 2
Đầu ra
19