สมมติว่ามีพิซซ่าชิ้นหนึ่งที่มีขนาดต่างกัน 3n ชิ้น ฉันและเพื่อนสองคนจะทานพิซซ่าชิ้นหนึ่งดังนี้ −
-
ฉันจะเลือกพิซซ่าชิ้นใดก็ได้
-
Amal เพื่อนของฉันจะเลือกชิ้นถัดไปในทิศทางทวนเข็มนาฬิกาที่ฉันเลือก
-
Bimal เพื่อนของฉันจะเลือกชิ้นถัดไปในทิศทางตามเข็มนาฬิกาที่ฉันเลือก
-
ทำซ้ำขั้นตอนเหล่านี้จนกว่าจะไม่มีชิ้นพิซซ่าอีกต่อไป
ขนาดของชิ้นพิซซ่าจะแสดงด้วยชิ้นอาร์เรย์วงกลมในทิศทางตามเข็มนาฬิกา เราต้องหาผลรวมของขนาดสไลซ์ให้ได้มากที่สุด
ดังนั้น หากอินพุตเป็น [9,8,6,1,1,8],

จากนั้นผลลัพธ์จะเป็น 16 ตามการเลือกชิ้นพิซซ่าขนาด 8 ในแต่ละเทิร์น ถ้าฉันเลือกชิ้นที่มีขนาด 9 เพื่อนของฉันจะเลือกชิ้นที่มีขนาด 8
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้อาร์เรย์ v และหนึ่งอาร์กิวเมนต์ m
-
n :=ขนาดของวี
-
กำหนดอาร์เรย์ 2D สองชุด dp1 และ dp2 ของขนาด (n + 1) x (m + 1) แต่ละรายการ
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
สำหรับการเริ่มต้น j :=0 เมื่อ j <=m อัปเดต (เพิ่ม j ขึ้น 1) ทำ −
-
x :=v[i]
-
ถ้า j
-
dp2[i + 1, j + 1] =สูงสุด dp2[i + 1, j + 1] และ dp1[i, j] + x)
-
dp1[i + 1, j] =สูงสุด dp1[i + 1, j], dp2[i, j] และ dp1[i, j]
-
-
-
-
ส่งกลับสูงสุด dp1[n, m] และ dp2[n, m]
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
n :=ขนาดของชิ้น
-
ยกเลิก :=0
-
ret :=สูงสุดของการแก้ปัญหา (สไลซ์จากดัชนี 1 ถึงจุดสิ้นสุด n/3) และสไลซ์[0] + การแก้ (สไลซ์จากดัชนี 2 ถึงจุดสิ้นสุด - 1, n/3 - 1)
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(vector <int> v, int m){
int n = v.size();
vector<vector<int> > dp1(n + 1, vector<int>(m + 1));
vector<vector<int> > dp2(n + 1, vector<int>(m + 1));
for (int i = 0; i < n; i++) {
for (int j = 0; j <= m; j++) {
int x = v[i];
if (j < m)
dp2[i + 1][j + 1] = max(dp2[i + 1][j + 1], dp1[i]
[j] + x);
dp1[i + 1][j] = max({ dp1[i + 1][j], dp2[i][j],
dp1[i][j] });
}
}
return max(dp1[n][m], dp2[n][m]);
}
int maxSizeSlices(vector<int>& slices) {
int n = slices.size();
int ret = 0;
ret = max(solve(vector<int>(slices.begin() + 1,
slices.end()), n / 3), slices[0] + solve(vector<int>(slices.begin() +
2, slices.end() - 1), n / 3 - 1));
return ret;
}
};
main(){
Solution ob;
vector<int> v = {9,8,6,1,1,8};
cout << (ob.maxSizeSlices(v));
} อินพุต
{9,8,6,1,1,8} ผลลัพธ์
16