ধরুন আমাদের n x m আকারের একটি আয়তক্ষেত্র আছে। আমাদের ন্যূনতম সংখ্যক পূর্ণসংখ্যার পার্শ্বযুক্ত বর্গক্ষেত্র বস্তুগুলি খুঁজে বের করতে হবে যা আয়তক্ষেত্রগুলিকে টাইল করতে পারে৷
সুতরাং, যদি ইনপুট n =2 এবং m =3,
এর মত হয়
তাহলে আউটপুট হবে 3, কারণ আমাদের তিনটি ব্লক দরকার।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি মানচিত্র m
সংজ্ঞায়িত করুন -
res :=inf
-
একটি ফাংশন dfs() সংজ্ঞায়িত করুন, এটি n, m, একটি অ্যারে h, cnt,
লাগবে -
যদি cnt>=res হয়, তাহলে −
-
ফেরত
-
-
isFull :=সত্য
-
pos :=-1, minH :=inf
-
আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −
-
যদি h[i]
-
isFull :=মিথ্যা
-
-
যদি h[i]
-
minH :=h[i]
-
pos :=i
-
-
-
যদি isFull অ-শূন্য হয়, তাহলে −
-
res :=ন্যূনতম res এবং cnt
-
ফেরত
-
-
কী :=0
-
ভিত্তি :=m + 1
-
আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −
-
key :=কী + h[i] * বেস
-
ভিত্তি :=ভিত্তি * (m + 1)
-
-
যদি কী s এবং s[key] <=cnt-এ থাকে, তাহলে −
-
ফেরত
-
-
s[কী] :=cnt
-
শেষ :=pos
-
যখন (শেষ + 1 <=n এবং h[end + 1] h[pos] এবং (end + 1 - pos + 1 + minH)
-
<=মি), করো −
-
(শেষ 1 দ্বারা বৃদ্ধি করুন)
-
-
j শুরু করার জন্য :=শেষ, যখন j>=pos, আপডেট করুন (j 1 দ্বারা কম করুন), −
-
curH :=j - pos + 1
-
n + 1
আকারের পাশে একটি অ্যারে সংজ্ঞায়িত করুন -
আরম্ভ করার জন্য i :=1, যখন i <=n, আপডেট করুন (i 1 দ্বারা বাড়ান), করবেন −
-
পরবর্তী[i] :=h[i]
-
-
আরম্ভ করার জন্য k :=pos, যখন k <=j, আপডেট করুন (k 1 দ্বারা বাড়ান), −
-
next[k] :=next[k] + curH
-
-
dfs(n, m, next, cnt + 1)
-
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
যদি n m এর সমান হয়, তাহলে −
-
রিটার্ন 1
-
-
যদি n> m, তাহলে
-
swap(n, m)
-
-
n + 1
আকারের একটি অ্যারে h সংজ্ঞায়িত করুন -
dfs(n, m, h, 0)
-
রিটার্ন রিটার্ন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#include <bits/stdc++.h> using namespace std; class Solution { public: map<int, int> s; int res = INT_MAX; void dfs(int n, int m, vector<int> h, int cnt){ if (cnt >= res) return; bool isFull = true; int pos = -1, minH = INT_MAX; for (int i = 1; i <= n; i++) { if (h[i] < m) isFull = false; if (h[i] < minH) { minH = h[i]; pos = i; } } if (isFull) { res = min(res, cnt); return; } long key = 0; long base = m + 1; for (int i = 1; i <= n; i++) { key += h[i] * base; base *= m + 1; } if (s.find(key) != s.end() && s[key] <= cnt) return; s[key] = cnt; int end = pos; while (end + 1 <= n && h[end + 1] == h[pos] && (end + 1 - pos + 1 + minH) <= m) end++; for (int j = end; j >= pos; j--) { int curH = j - pos + 1; vector<int> next(n + 1); for (int i = 1; i <= n; i++) next[i] = h[i]; for (int k = pos; k <= j; k++) { next[k] += curH; } dfs(n, m, next, cnt + 1); } } int tilingRectangle(int n, int m){ if (n == m) return 1; if (n > m) swap(n, m); vector<int> h(n + 1); dfs(n, m, h, 0); return res; } }; main(){ Solution ob; cout << (ob.tilingRectangle(2, 3)); }
ইনপুট
2,3
আউটপুট
3