일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- c++
- 독서
- 운영체제
- cs
- OS
- language
- network
- D2
- 데이터베이스
- LeetCode
- 프로그래머스
- 문제풀이
- 알고리즘
- db
- 법의학
- algorithm
- Database
- BOJ
- 감상문
- 네트워크
- algogritim
- data structure
- D3
- Programmers
- 백준
- Computer Science
- swea
- 재테크/투자
- SW Expert Academy
- 자료구조
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 1520번 내리막 길 본문
문제
BOJ 1520 : https://www.acmicpc.net/problem/1520
1520번: 내리막 길
첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다.
www.acmicpc.net
접근
내리막 길로만 갔을 때 도착지까지 갈 수 있는 경로의 갯수를 구하는 문제이다. 이는 DFS로만 풀면 시간 초과가 나기 때문에 DP + DFS를 이용하여 문제를 해결하였다.
코드
#include <iostream>
using namespace std;
int m, n, map[505][505], visit[505][505], dx[] = {-1, 1, 0, 0}, dy[] = {0, 0, -1, 1};
int dfs(int a, int b) {
if (a == m - 1 && b == n - 1)
return 1;
else if (visit[a][b] == -1) {
visit[a][b] = 0;
for (int i = 0; i < 4; i++) {
int newx = a + dx[i];
int newy = b + dy[i];
if (newx >= 0 && newx < m && newy >= 0 && newy < n && map[newx][newy] < map[a][b])
visit[a][b] += dfs(newx, newy);
}
}
return visit[a][b];
}
int main() {
cin >> m >> n;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
visit[i][j] = -1;
}
}
cout << dfs(0, 0);
return 0;
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 22252번 정보 상인 호석 (0) | 2021.09.06 |
---|---|
[BOJ 백준] 21608번 상어 초등학교 (0) | 2021.08.18 |
[BOJ 백준] 1865번 웜홀 (0) | 2021.07.25 |
[BOJ 백준] 2671번 잠수함식별 (0) | 2021.07.24 |
[BOJ 백준] 1867번 돌멩이 제거 (0) | 2021.07.23 |
Comments