


백준 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