백준 28129 - 2022 APC가 어려웠다고요?
위 포스트는 백준 28129 - 2022 APC가 어려웠다고요?의 풀이입니다. dp[i][j] := i번째 수가 j가 되는 경우의 수 dp[i][j]=∑k=max(j−k,a[i−…
2025/03/28
Jinsoolve.
위 포스트는 백준 6569 - 몬드리안의 꿈에 대한 해설입니다.
| ... | ... | ... | ... | ... | ... | ... | ... |
|---|---|---|---|---|---|---|---|
| 채워짐 | 채워짐 | 채워짐 | 채워짐 | 채워짐 | 채워짐 | 채워짐 | 채워짐 |
| 채워짐 | 채워짐 | 채워짐 | 채워짐 | w-1 | ... | ... | ... |
| ... | 2 | 1 | 0 | (h,w) |
위와 같이 큰 직사각형이 존재한다고 하자.
dp[h][w][bit] := bit상태일 때, (h,w)부터 끝까지 큰 직사각형을 2x1 직사각형으로 채우는 경우의 수라 하자. (이때 (0,0) ~ (h-1,w-1) 영역은 모두 채워져 있음을 가정한다.)
여기서 bit는 w개의 bit로 이루어져 있는데, 이는 (w-1) (w-2) ... (2) (1) (0) 을 의미한다.
각 비트는 채워진 여부를 의미한다. 0이면 비어있고 1이면 채워져 있다.
이때 다음과 같이 풀면 된다.
cpp#include <bits/stdc++.h> #define endl "\n" #define all(v) (v).begin(), (v).end() #define all1(v) (v).begin()+1, (v).end() #define For(i, a, b) for(int i=(a); i<(b); i++) #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define Bor(i, a, b) for(int i=(a)-1; i>=(b); i--) #define BOR(i, a, b) for(int i=(a); i>=(b); i--) #define ft first #define sd second using namespace std; using ll = long long; using lll = __int128_t; using ulll = __uint128_t; using ull = unsigned long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; using ti3 = tuple<int, int, int>; using tl3 = tuple<ll, ll, ll>; template<typename T> using ve = vector<T>; template<typename T> using vve = vector<vector<T>>; template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } const int INF = 987654321; const int INF0 = numeric_limits<int>::max(); const ll LNF = 987654321987654321; const ll LNF0 = numeric_limits<ll>::max(); int H, W; ll dp[11][11][1<<11]; ll sol(int h, int w, int bit) { if(h==H) return (bit == ((1<<W)-1)); ll &ret = dp[h][w][bit]; if(ret != -1) return ret; int nh = h, nw = w+1; if(nw == W) nh++, nw=0; if(h!=0 and (bit & (1<<(W-1))) == 0) return ret = sol(nh,nw,(bit*2+1)%(1<<W)); ret = sol(nh,nw,(bit*2)%(1<<W)); if(w!=0 and (bit & 1) == 0) ret += sol(nh,nw,((bit+1)*2+1)%(1<<W)); return ret; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); while(true) { cin >> H >> W; if(H==0 and W==0) break; memset(dp, -1, sizeof dp); cout << sol(0,0,0) << endl; } return 0; }
위 포스트는 백준 28129 - 2022 APC가 어려웠다고요?의 풀이입니다. dp[i][j] := i번째 수가 j가 되는 경우의 수 dp[i][j]=∑k=max(j−k,a[i−…
2025/03/28
위 포스트는 백준 1055 - 끝이없음의 해설입니다. 문자열이 재귀적으로 반복하는 것을 알 수 있다. 이때 min과 max의 차이가 최대 100개 정도임을 알 수 있고, 우리는…
2025/03/05
위 포스트는 백준 1787 - 문자열의 주기 예측 의 해설입니다. 결국 부분 문자열에서 가장 짧으면서 일치하는 Prefix와 Suffix를 찾으면 된다. (해당 길이를 전체…
2025/03/05
위 포스트는 백준 8872 - 빌라봉 문제의 해설입니다. 위 문제에는 여러 개의 트리가 존재한다. 임의의 2개의 트리를 서로 이을 때 최대 시간이 최소가 되게 하기 위해서는 각…
2025/03/04