สมมติว่าเรามีจำนวนเต็มบวก n เราต้องแยกมันเป็นผลรวมของจำนวนบวกอย่างน้อยสองจำนวนและเพิ่มผลคูณของจำนวนเต็มเหล่านั้นให้มากที่สุด เราต้องหาสินค้าให้ได้มากที่สุด ดังนั้นหากตัวเลขคือ 10 คำตอบจะเป็น 36 เช่น 10 =3 + 3 + 4, 3 * 3 * 4 =36
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการแก้ปัญหา () ซึ่งจะใช้เวลา n อาร์เรย์ dp และแฟล็ก
-
ถ้า n เป็น 0 ให้คืนค่า 1
-
ถ้า dp[n] ไม่ใช่ -1 ให้คืนค่า dp[n]
-
end :=n – 1 เมื่อตั้งค่าแฟล็ก มิฉะนั้น n
-
ยกเลิก :=0
-
สำหรับผมอยู่ในช่วง 1 ถึงสิ้นสุด
-
ret :=สูงสุดของ ret และ i* แก้ (n – i, dp, false)
-
-
set dp[n] :=ret และ return
-
จากวิธีหลัก ให้สร้างอาร์เรย์ dp ขนาด n + 1 แล้วเติมด้วย – 1
-
กลับแก้(n, dp)
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(int n, vector <int>& dp, bool flag = true){
if(n == 0) return 1;
if(dp[n] != -1) return dp[n];
int end = flag? n - 1: n;
int ret = 0;
for(int i = 1; i <= end; i++){
ret = max(ret, i * solve(n - i, dp, false));
}
return dp[n] = ret;
}
int integerBreak(int n) {
vector <int>dp(n + 1, -1);
return solve(n, dp);
}
};
main(){
Solution ob;
cout << (ob.integerBreak(10));
} อินพุต
10
ผลลัพธ์
36