สมมุติว่ามีพ่อครัว และเขาได้รวบรวมข้อมูลเกี่ยวกับระดับความพึงพอใจของอาหารจานเดียวของเขา เชฟสามารถปรุงอาหารจานใดก็ได้ใน 1 หน่วย ค่าสัมประสิทธิ์เวลาเท่ากันของจานคือระยะเวลาที่ใช้จริง
เพื่อปรุงอาหารจานนั้นรวมทั้งจานก่อนหน้าคูณด้วยระดับความพึงพอใจ Sotime[i]*satisfaction[i].
เราต้องหาผลรวมสูงสุดของค่าสัมประสิทธิ์ Like-time ที่เชฟจะได้รับหลังการเตรียมอาหาร สามารถสั่งอาหารตามลำดับใดก็ได้ และเชฟสามารถทิ้งอาหารบางจานเพื่อให้ได้มูลค่าสูงสุด
ดังนั้น หากอินพุตเป็น [-1,-7,0,6,-7] ผลลัพธ์จะเป็น 17 หลังจากลบจานที่สองและจานสุดท้าย ค่าสัมประสิทธิ์เวลาไลค์สูงสุดจะเท่ากับ -1*1 + 0*2 + 6*3 =17.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดขนาดอาร์เรย์ dp:505 x 505
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้เวลา idx, เวลา, อาร์เรย์ v,
-
ถ้า idx เท่ากับขนาดของ v แล้ว −
-
คืนค่า 0
-
-
ถ้า dp[idx, time] ไม่เท่ากับ -1 แล้ว −
-
ส่งคืน dp[idx, เวลา]
-
-
ret :=-inf
-
ret :=สูงสุดของการแก้ปัญหา (idx + 1, เวลา, v) และ v[idx] * เวลา + การแก้ปัญหา (idx + 1, เวลา + 1, v)
-
dp[idx, time] :=ยกเลิก
-
รีเทิร์น
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
เติม -1 นี้ด้วย dp
-
จัดเรียงอาร์เรย์ v
-
กลับแก้(0, 1, v)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int dp[505][505];
int solve(int idx, int time, vector <int>& v){
if(idx == v.size()) return 0;
if(dp[idx][time] != -1) return dp[idx][time];
int ret = INT_MIN;
ret = max(solve(idx + 1, time, v), v[idx] * time + solve(idx
+ 1, time + 1, v));
return dp[idx][time] = ret;
}
int maxSatisfaction(vector<int>& v) {
memset(dp, -1, sizeof(dp));
sort(v.begin(), v.end());
return solve(0, 1, v);
}
};
main(){
Solution ob;
vector<int> v = {-1,-7,0,6,-7};
cout << (ob.maxSatisfaction(v));
} อินพุต
{-1,-7,0,6,-7} ผลลัพธ์
17