반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 5569 출근 경로 본문

백준(Baekjoon) 문제

백준 5569 출근 경로

huiung 2020. 1. 21. 00:18
반응형

출근 경로를 구하는 dp 문제입니다.  상근이가 동이나 북쪽으로 이동을 하는데 교차로에서 방향을 변경한 경우 그 다음번에는 방향을 변경 할 수 없습니다. 따라서 상근이의 현재 방향과 방향 전환이 가능한지 여부를 저장해 두어야 합니다.

따라서 dp 식을 dp[i][j][k][l] 로 정하고 (i,j에서 상근이는 l 방향이고 k(방향전환 가능여부) ) 의 의미를 가집니다.

 

따라서 이에 따라 i,j에서 총4가지 경우에 대해 아래와 같이 식을 세울 수 있습니다.

방향전환이 불가능한 경우는 이전칸에서 방향전환을 한 경우이므로 그경우를 넣어주고

방향전환이 가능한 경우는 이전칸에서 방향전환이 가능 / 불가능한 경우 모두 가능하므로 더해서 넣어줍니다.

 

dp[i][j][0][0] = (dp[i - 1][j][0][0] + dp[i - 1][j][1][0])%MOD;
dp[i][j][0][1] = (dp[i][j - 1][0][1] + dp[i][j - 1][1][1])%MOD;
dp[i][j][1][0] = (dp[i - 1][j][0][1])%MOD;
dp[i][j][1][1] = (dp[i][j - 1][0][0])%MOD;

 

아래는 전체 코드입니다.

 

 

#include <iostream>

using namespace std;
#define MOD 100000

int main(void) {

	int w, h; cin >> w >> h;
	int dp[101][101][2][2] = { 0, }; //3,4 번째 인덱스는 방향전환 가능 여부와 내 방향 0->북 1->동

	for (int i = 2; i <= h; i++)
		dp[i][1][0][0] = 1;

	for (int i = 2; i <= w; i++)
		dp[1][i][0][1] = 1;


	for(int i = 2; i <= h; i++)
		for (int j = 2; j <= w; j++) {
			dp[i][j][0][0] = (dp[i - 1][j][0][0] + dp[i - 1][j][1][0])%MOD;
			dp[i][j][0][1] = (dp[i][j - 1][0][1] + dp[i][j - 1][1][1])%MOD;
			dp[i][j][1][0] = (dp[i - 1][j][0][1])%MOD;
			dp[i][j][1][1] = (dp[i][j - 1][0][0])%MOD;
		}

	cout << (dp[h][w][0][0] + dp[h][w][0][1] + dp[h][w][1][0] + dp[h][w][1][1]) % MOD;
	return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1275 커피숍2  (0) 2020.01.22
백준 2243 사탕상자  (0) 2020.01.22
백준 16236 아기 상어  (0) 2020.01.21
백준 2449 전구  (0) 2020.01.19
백준 2343 Dance Dance Revolution  (0) 2020.01.19