티스토리 뷰
문제 링크입니다 : https://www.acmicpc.net/problem/1074
1074번: Z
한수는 2차원 배열 (항상 2^N * 2^N 크기이다)을 Z모양으로 탐색하려고 한다. 예를 들어, 2*2배열을 왼쪽 위칸, 오른쪽 위칸, 왼쪽 아래칸, 오른쪽 아래칸 순서대로 방문하면 Z모양이다. 만약, 2차원 ��
www.acmicpc.net
분할 정복 + DP문제였다.
문제는 재미있고 아이디어는 쉬웠다.
분할 정복과 DP를 동시에 구현하려고 하니 실수가 생기는 경우가 있었다.
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
const int dy[4] = {0, 0, 1, 1};
const int dx[4] = {0, 1, 0, 1};
ll N, r, c;
ll cnt = 0;
ll cache[16];
ll getTime(ll y, ll x, ll N) {
if(N == 0 && y == r && x == c) {
cout << cnt++;
return 1;
}
if(N == 0) {
cnt++;
return 1;
}
ll& ret = cache[N];
if(!(y <= r && r < y + pow(2, N) && x <= c && c < x + pow(2, N)) && ret != -1) {
cnt += ret;
return ret;
}
ret = 0;
ll half = pow(2, N - 1);
for(int dir = 0; dir < 4; dir++) {
ll ny = y + dy[dir] * half;
ll nx = x + dx[dir] * half;
ret += getTime(ny, nx, N - 1);
}
return ret;
}
int main() {
cin >> N >> r >> c;
memset(cache, -1, sizeof(cache));
ll temp = getTime(0, 0, N);
return 0;
}
개발 환경 : vscode
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
백준 - 11726 2xn 타일링 (0) | 2020.08.14 |
---|---|
백준 - 2193 이친수 (0) | 2020.08.14 |
백준 - 1725 히스토그램 (0) | 2020.08.13 |
백준 - 2104 부분배열 고르기 (0) | 2020.08.13 |
백준 - 16947 서울 지하철 2호선 (0) | 2020.08.09 |
댓글