สมมติว่าบริษัทหนึ่งต้องการให้พนักงานที่ดีที่สุดคนหนึ่งมีทางเลือกในการเดินทางไปตามเมืองต่างๆ เพื่อรวบรวมทรัพยากรบางส่วน แต่พนักงานก็ต้องการวันหยุดพักผ่อนเช่นกัน เราสามารถไปพักผ่อนในเมืองหรือสัปดาห์บางเมืองได้ งานของเราคือจัดตารางการเดินทางเพื่อเพิ่มจำนวนวันหยุดพักร้อนที่เราสามารถทำได้ แต่มีกฎและข้อจำกัดบางอย่างที่เราต้องปฏิบัติตาม
-
เราสามารถเดินทางได้เฉพาะในเมือง N เท่านั้น พวกมันแสดงด้วยดัชนีตั้งแต่ 0 ถึง N-1 ประการแรก เราอยู่ในเมืองดัชนี 0 ในวันจันทร์
-
เมืองเหล่านี้เชื่อมต่อกันด้วยเที่ยวบิน เรามีเมทริกซ์ N x N หนึ่งตัว (ไม่จำเป็นต้องสมมาตร) เพื่อแสดงเที่ยวบิน เที่ยวบินที่แสดงสถานะสายการบินจากเมือง i ไปยังเมือง j. หากไม่มีเที่ยวบินจากเมือง i ไปยังเมือง j ดังนั้นเมทริกซ์เที่ยวบิน[i][j] จะเป็น 0; มิฉะนั้น เที่ยวบิน[i][j] =1 นอกจากนี้ เที่ยวบิน[i][i] =0 สำหรับ i ทั้งหมด
-
เรามี K สัปดาห์ที่จะเดินทาง เราขึ้นเที่ยวบินได้ไม่เกินวันละครั้งและขึ้นเที่ยวบินได้เฉพาะเช้าวันจันทร์ของแต่ละสัปดาห์เท่านั้น
-
สำหรับแต่ละเมือง เราสามารถจำกัดวันลาพักร้อนในสัปดาห์ต่างๆ ได้เท่านั้น เพื่อที่เราจะได้เมทริกซ์ N*K ที่เรียกว่าวันที่ซึ่งแสดงความสัมพันธ์นี้ สำหรับค่าของ days[i][j] มันหมายถึงจำนวนวันสูงสุดที่เราสามารถพักผ่อนในเมือง i ในสัปดาห์ j
ดังนั้น หากเรามีเมทริกซ์เที่ยวบินและเมทริกซ์วัน และเราจำเป็นต้องส่งออกวันหยุดสูงสุดที่เราสามารถทำได้ในช่วง K สัปดาห์
ดังนั้น หากอินพุตเป็นเหมือนเที่ยวบิน =[[0,1,1],[1,0,1],[1,1,0]], วัน =[[1,3,1],[6,0 ,3,[3,3,3]] จากนั้นผลลัพธ์จะเป็น 12
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=แถวของเที่ยวบิน
-
m :=คอลัมน์ของเมทริกซ์วัน
-
กำหนดขนาดอาร์เรย์ 2 มิติหนึ่ง dp (m + 1) x n
-
สำหรับการเริ่มต้น i :=m - 1 เมื่อ i>=0, อัปเดต (ลด i โดย 1) ให้ทำ -
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
สำหรับการเริ่มต้น k :=0 เมื่อ k
-
ถ้า j เหมือนกับ k หรือไฟลต์[j, k] ไม่ใช่ศูนย์ ดังนั้น −
-
dp[i, j] :=สูงสุดของ dp[i, j] และวัน[j, i] + dp[i + 1, k]
-
-
-
-
-
ยกเลิก :=dp[0, 0]
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน
-
ถ้าเที่ยวบิน[0, i] ไม่ใช่ศูนย์ ดังนั้น −
-
ret :=สูงสุดของ ret และ dp[0, i]
-
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#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;
}
};
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