My Profile

김형훈

안녕하세요.
김형훈입니다.

백준 17070 파이프 옮기기 1

백준 17070 파이프 옮기기 1

2022년 11월 28일

2022년 11월 28일

cpp, 다이나믹 프로그래밍

문제

문제

풀이

풀이

현재 i , j칸에서 가로인 상태라면, 이전 칸으로부터 이동해 올 수 있는 칸과 상태는 i , j-1의 가로 상태와 i , j-1의 대각선 상태가 있다.

이러한 방식으로 각 칸에서 파이프가 취할 수 있는 각각의 상태(가로,세로,대각선)를 정의한 후 각각의 상태에 대해 이전 칸에서 이동해 올 수 있는 값들을 더해 나가는 식으로 풀 수 있다.

코드

코드

#include <bits/stdc++.h>

using namespace std;

int n;
bool board[20][20];
int dp[20][20][3];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j)
            cin >> board[i][j];
    dp[1][2][0] = 1;
    for(int i=1; i<=n; ++i)
        for(int j=1; j<=n; ++j){
            if(i<=1 && j<=2) continue; // 초기값 예외
            if(board[i][j]) continue; // 벽
            // 가로
            if(j-1 >= 1) dp[i][j][0] = dp[i][j-1][0] + dp[i][j-1][2];
            // 세로
            if(i-1 >= 1) dp[i][j][1] = dp[i-1][j][1] + dp[i-1][j][2];
            // 대각선
            if(i-1 >=1 && j-1 >= 1 && !board[i-1][j] && !board[i][j-1]) dp[i][j][2] = dp[i-1][j-1][0] + dp[i-1][j-1][1] + dp[i-1][j-1][2];
        }
    cout << dp[n][n][0] + dp[n][n][1] + dp[n][n][2];
}

결과

결과

Copyright © 2024 Hyunghoon Kim