반응형
문제 출처 :
https://www.acmicpc.net/problem/17069
알고리즘 분석 :
문제 해결에 필요한 사항
1. Dynamic Programming
2. 점화식 세우는 방법
3차원 dp를 이용하여 문제를 해결 할 수 있다.
i,j 좌표의 대각선으로 갈 수 있는 것은 결국 i-1,j-1에서 가로,대각선,세로 방향으로 있던 모든 것들이 올 수 있고
i,j 좌표의 가로로 올 수 있는 것은 i,j-1에서의 가로, 대각선 방향이었던 것들
i,j 좌표의 세로로 올 수 있는 것은 i-1,j에서의 세로, 대각선 방향들이 올 수 있다.
이를 3차원 dp로 나타내면 정답을 구할 수 있다.
소스 코드 :
#include <iostream>
#include <cstdio>
#include <queue>
typedef long long ll;
using namespace std;
// 가로 0 대각선 1 세로 2
int dy[3] = { 0,1,1 };
int dx[3] = { 1,1,0 };
ll dp[35][35][4];
int arr[35][35];
struct INFO {
int y, x, dir;
};
int n;
bool chkArr(int y, int x) {
if (0 <= y && y < n && 0 <= x && x < n && !arr[y][x])
return true;
return false;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &arr[i][j]);
dp[0][1][0] = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if(arr[i][j] == 1)
continue;
if (chkArr(i - 1, j - 1) && chkArr(i - 1, j) && chkArr(i, j - 1)) {
dp[i][j][1] += dp[i - 1][j - 1][0];
dp[i][j][1] += dp[i - 1][j - 1][2];
dp[i][j][1] += dp[i - 1][j - 1][1];
}
if (chkArr(i, j - 1)) {
dp[i][j][0] += dp[i][j - 1][0];
dp[i][j][0] += dp[i][j - 1][1];
}
if (chkArr(i - 1, j)){
dp[i][j][2] += dp[i - 1][j][1];
dp[i][j][2] += dp[i - 1][j][2];
}
}
printf("%lld\n", dp[n - 1][n - 1][0] + dp[n - 1][n - 1][1] + dp[n - 1][n - 1][2]);
return 0;
}
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[14923번] 미로 탈출 (0) | 2019.04.09 |
---|---|
[SwExpertAcademy] 비밀 (0) | 2019.04.04 |
[17070번] 파이프 옮기기 1 (0) | 2019.03.27 |
[프로그래머스] 전화번호 목록 (0) | 2019.03.18 |
[Programmers] 완주하지 못한 선수 (0) | 2019.03.13 |