본문 바로가기
백준(C언어)/23년 11월

[C] 백준 - 1520번: 내리막 길

by C0MPAS 2023. 11. 20.

11월 20일(월) - 다이나믹 프로그래밍 (1520번)

 

1520번: 내리막 길

여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으

www.acmicpc.net

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

최초 생각 정리

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

문제점

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

풀이

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)

#include <stdio.h>

int M, N;
int map[501][501];
int dp[501][501];

int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };

int dfs(int y, int x)
{
	if (y == M && x == N)
	{
		return 1;
	}

	if (dp[y][x] == -1)
	{
		dp[y][x] = 0;

		for (int i = 0; i < 4; i++)
		{
			int next_x = x + dx[i];
			int next_y = y + dy[i];

			if (next_x < 1 || next_y < 1 || next_x > N || next_y > M)
			{
				continue;
			}
			if (map[next_y][next_x] < map[y][x])
			{
				dp[y][x] = dp[y][x] + dfs(next_y, next_x);
			}

		}
	}
	
	return dp[y][x];
}

int main(void)
{
	scanf("%d %d", &M, &N);

	for (int i = 1; i <= M; i++)
	{
		for (int j = 1; j <= N; j++)
		{
			scanf("%d", &map[i][j]);
			dp[i][j] = -1;
		}
	}

	printf("%d", dfs(1, 1));
	return 0;
}

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

'백준(C언어) > 23년 11월' 카테고리의 다른 글

[C] 백준 - 2212번: 센서  (0) 2023.11.22
[C] 백준 - 1043번: 거짓말  (0) 2023.11.21
[C] 백준 - 2133번: 타일 채우기  (1) 2023.11.13
[C] 백준 - 2437번: 저울  (0) 2023.11.08
[C] 백준 - 1717번: 집합의 표현  (0) 2023.11.07

댓글