สมมุติว่าเรามีบ้านติดกัน n หลัง ตอนนี้บ้านแต่ละหลังสามารถทาสีหนึ่งใน k สีได้ ค่าทาสีบ้านแต่ละหลังที่มีสีต่างกัน ตอนนี้เราต้องจำไว้ว่าเราต้องทาสีบ้านทุกหลังเพื่อไม่ให้บ้านติดกันสองหลังมีสีเดียวกัน
ค่าใช้จ่ายในการทาสีบ้านแต่ละหลังด้วยสีที่แน่นอนจะแสดงด้วยเมทริกซ์ของคำสั่ง n x k และเราต้องหาต้นทุนขั้นต่ำในการทาสีบ้านทุกหลัง
ดังนั้นหากอินพุตเป็นแบบ
| 1 | 5 | 3 |
| 2 | 9 | 4 |
ผลลัพธ์จะเป็น 5 เนื่องจากเพ้นท์เฮาส์ 0 เป็นสี 0, เพ้นท์เฮาส์ 1 เป็นสี 2 จากนั้นต้นทุนขั้นต่ำคือ 1 + 4 =5; หรือเพ้นท์เฮาส์ 0 เป็นสี 2 เพ้นท์เฮาส์ 1 เป็นสี 0 ต้นทุนขั้นต่ำคือ 3 + 2 =5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาดแถวของต้นทุน
-
m :=(ถ้า n ไม่ใช่ศูนย์ ให้กำหนดขนาดของต้นทุน มิฉะนั้น 0)
-
ret :=inf
-
สำหรับการเริ่มต้น i :=1 เมื่อฉัน
-
req :=inf
-
กำหนดอาร์เรย์ lmins ขนาด m
-
กำหนดขนาดอาร์เรย์ rms
-
lmins[0] :=cost[i - 1, 0]
-
rmins[m - 1] =ค่าใช้จ่าย[i - 1, m - 1]
-
สำหรับการเริ่มต้น j :=1 เมื่อ j
-
lmins[j] :=ต้นทุนขั้นต่ำ[i - 1, j] และ lmins[j - 1]
-
-
สำหรับการเริ่มต้น j :=m - 2 เมื่อ j>=0, อัปเดต (ลด j โดย 1) ให้ทำ -
-
rmins[j] :=ต้นทุนขั้นต่ำ[i - 1, j] และ rmins[j + 1]
-
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
ซ้าย :=(ถ้า j - 1>=0 แล้ว lmins[j - 1] มิฉะนั้น inf)
-
right :=(ถ้า j + 1
-
ค่าใช้จ่าย[i, j] :=ค่าใช้จ่าย[i, j] + นาที(ซ้าย, ขวา)
-
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ret :=ขั้นต่ำของ ret และค่าใช้จ่าย[n - 1, i]
-
-
return (ถ้า ret เหมือนกับ inf แล้ว 0, มิฉะนั้น ret)
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minCostII(vector<vector<int>>& costs) {
int n = costs.size();
int m = n ? costs[0].size() : 0;
int ret = INT_MAX;
for (int i = 1; i < n; i++) {
int req = INT_MAX;
vector<int> lmins(m);
vector<int> rmins(m);
lmins[0] = costs[i - 1][0];
rmins[m - 1] = costs[i - 1][m - 1];
for (int j = 1; j < m; j++) {
lmins[j] = min(costs[i - 1][j], lmins[j - 1]);
}
for (int j = m - 2; j >= 0; j--) {
rmins[j] = min(costs[i - 1][j], rmins[j + 1]);
}
for (int j = 0; j < m; j++) {
int left = j - 1 >= 0 ? lmins[j - 1] : INT_MAX;
int right = j + 1 < m ? rmins[j + 1] : INT_MAX;
costs[i][j] += min(left, right);
}
}
for (int i = 0; i < m; i++) {
ret = min(ret, costs[n - 1][i]);
}
return ret == INT_MAX ? 0 : ret;
}
};
main(){
Solution ob;
vector<vector<int>> v = {{1,5,3},{2,9,4}};
cout <<(ob.minCostII(v));
} อินพุต
{{1,5,3},{2,9,4}} ผลลัพธ์
5