ปัญหา
สมมติว่าบริษัทหนึ่งต้องการให้พนักงานที่ดีที่สุดได้เลือกเดินทางระหว่าง N เมืองเพื่อรวบรวมทรัพยากร แต่พนักงานก็ต้องการวันหยุดด้วย เราสามารถหยุดพักได้ในบางเมืองและบางสัปดาห์ งานของเราคือจัดตารางการเดินทางเพื่อเพิ่มจำนวนวันหยุดที่เราสามารถหยุดได้ แต่มีกฎและข้อจำกัดที่ต้องปฏิบัติ
- เราสามารถเดินทางระหว่าง N เมืองได้ ซึ่งแทนด้วยดัชนี 0 ถึง N-1 เริ่มต้นเราอยู่ในเมืองที่มีดัชนี 0 ในวันจันทร์
- เมืองเหล่านี้เชื่อมต่อกันด้วยเที่ยวบิน เรามีเมทริกซ์ N x N (ไม่จำเป็นต้องสมมาตร) เพื่อแทนเที่ยวบิน flights[i][j] แทนสถานะสายการบินจากเมือง i ไปเมือง j หากไม่มีเที่ยวบินจากเมือง i ไปเมือง j flights[i][j] จะเป็น 0 มิฉะนั้น flights[i][j] = 1 นอกจากนี้ flights[i][i] = 0 สำหรับทุก i
- เรามี K สัปดาห์ในการเดินทาง เราสามารถขึ้นเครื่องได้สูงสุด 1 ครั้งต่อวัน และขึ้นได้เฉพาะเช้าวันจันทร์ของแต่ละสัปดาห์
- สำหรับแต่ละเมือง เราสามารถมีวันหยุดจำกัดในสัปดาห์ต่างๆ ได้ สำหรับนั้นเรามีเมทริกซ์ N*K ชื่อ days แสดงความสัมพันธ์นี้ days[i][j] แทนจำนวนวันหยุดสูงสุดที่เราสามารถหยุดได้ในเมือง i ในสัปดาห์ j
ดังนั้น หากเรามีเมทริกซ์ flights และ days เราต้องหาจำนวนวันหยุดสูงสุดที่เราสามารถหยุดได้ใน K สัปดาห์
เช่น ถ้าผนวกเขาเป็น flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[1,3,1],[6,0,3],[3,3,3]] ผลลัพธ์จะเป็น 12
วิธีแก้ปัญหา
- n := จำนวนแถวของ flights
- m := จำนวนคอลัมน์ของเมทริกซ์ days
- กำหนดอาร์เรย์ 2D dp ขนาด (m+1) x n
- for i := m-1 ถึง 0 (ลดทีละ 1) ทำ:
- for j := 0 ถึง n-1 ทำ:
- for k := 0 ถึง n-1 ทำ:
- ถ้า j เท่ากับ k หรือ flights[j][k] ไม่เป็น 0 แล้ว:
- dp[i][j] := max(dp[i][j], days[j][i] + dp[i+1][k])
- ถ้า j เท่ากับ k หรือ flights[j][k] ไม่เป็น 0 แล้ว:
- for k := 0 ถึง n-1 ทำ:
- for j := 0 ถึง n-1 ทำ:
- ret := dp[0][0]
- for i := 1 ถึง n-1 ทำ:
- ถ้า flights[0][i] ไม่เป็น 0 แล้ว: ret := max(ret, dp[0][i])
- คืนค่า ret
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
int n = flights.size();
int m = days[0].size();
vector<vector<int> > dp(m + 1, vector<int>(n));
for (int i = m - 1; i >= 0; i--) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
if (j == k || flights[j][k]) {
dp[i][j] = max(dp[i][j], days[j][i] + dp[i + 1][k]);
}
}
}
}
int ret = 0;
ret = dp[0][0];
for (int i = 1; i < n; i++) {
if (flights[0][i]) {
ret = max(ret, dp[0][i]);
}
}
return ret;
}
};
int main(){
Solution ob;
vector<vector<int>> v1 = {{0,1,1},{1,0,1},{1,1,0}}, v2 = {{1,3,1},{6,0,3},{3,3,3}};
cout << (ob.maxVacationDays(v1, v2));
}
อินพุต
v1 = {{0,1,1},{1,0,1},{1,1,0}}, v2 = {{1,3,1},{6,0,3},{3,3,3}}
เอาต์พุต
12