크기가 n x m인 직사각형이 있다고 가정합니다. 직사각형을 타일링할 수 있는 정사각형 개체의 최소 개수를 찾아야 합니다.
따라서 입력이 n =2 및 m =3인 경우
3개의 블록이 필요하므로 출력은 3이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 맵 정의
-
res :=inf
-
dfs() 함수를 정의하면 n, m, 배열 h, cnt,
가 필요합니다. -
cnt>=res이면 -
-
반환
-
-
isFull :=참
-
위치 :=-1, 최소H :=정보
-
initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −
-
h[i]
-
isFull :=거짓
-
-
h[i]
-
minH :=h[i]
-
위치 :=나는
-
-
-
isFull이 0이 아니면 -
-
res :=res 및 cnt의 최소값
-
반환
-
-
키 :=0
-
기본 :=m + 1
-
initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −
-
키 :=키 + h[i] * 기본
-
기본 :=기본 * (m + 1)
-
-
키가 s 및 s[key] <=cnt에 있으면 -
-
반환
-
-
s[키] :=cnt
-
끝 :=위치
-
동안 (end + 1 <=n 및 h[end + 1]은 h[pos]와 동일하고 (end + 1 - pos + 1 + minH)
-
<=m), ~
-
(끝을 1씩 증가)
-
-
초기화 j :=end, j>=pos일 때 업데이트(j를 1만큼 감소), −
-
curH :=j - 위치 + 1
-
n + 1 크기의 배열을 정의하십시오.
-
initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −
-
다음[i] :=h[i]
-
-
초기화 k :=pos의 경우 k <=j일 때 업데이트(k를 1만큼 증가), −
-
다음[k] :=다음[k] + curH
-
-
dfs(n, m, 다음, cnt + 1)
-
-
주요 방법에서 다음을 수행하십시오 -
-
n이 m과 같으면 -
-
1 반환
-
-
n> m이면
-
스왑(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