1520번: 내리막 길
여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으
www.acmicpc.net
DFS + DP 사용
처음 접근은 BFS를 사용했지만 시간 초과가 나왔다. 상하좌우 4면을 다 체크하면서 500x500의 배열을 탐색하는 경우
최악의 경우에 4^(500*500) 인걸,,,생각 못했다,,,,,
dp로 어떻게 접근해야하는지 감이 안잡혀서 구글링을 해봤는데, dp[a][b] = c 라고 한다면, (a,b) ~(n-1,m-1)에 c가지의 경로로 도달가능 이 식을 보고,,, 다시 재 도전했다.
이미 탐색을 한 위치라면, 굳이 또 돌지않고 예전에 구한 값을 재활용 하며 시간을 줄여주기,,,,,난 아직 멀었구나,,,,
#include <bits/stdc++.h>
using namespace std;
int n,m;
int board[501][501];
int dp[501][501];
int dx[4] ={0,1,0,-1};
int dy[4] ={1,0,-1,0};
int dfs(int x, int y){
if(x == n-1 && y == m-1) return 1;
if(dp[x][y] != -1) return dp[x][y];
dp[x][y] = 0;
for(int i=0; i<4; i++){
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
if(board[nx][ny]>= board[x][y]) continue;
dp[x][y] += dfs(nx,ny);
}
return dp[x][y];
}
int main(void){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin>>board[i][j];
}
}
memset(dp,-1,sizeof(dp));
cout<<dfs(0,0)<<"\n";
}
'Algorithm > BOJ' 카테고리의 다른 글
[c++] 백준 1976 여행 가자 (0) | 2021.07.05 |
---|---|
[c++] 백준 1717 집합의 표현 (0) | 2021.07.05 |
[c++] 백준 5014 스타트링크 (0) | 2021.04.09 |
[c++] 백준 2589 보물섬 (0) | 2021.04.09 |
[c++] 백준 3055 탈출 (2) | 2021.04.07 |