본문 바로가기

알고리즘

[C++] BOJ-1520

 

 

문제풀이


1. 백트래킹 + DP를 이용해서 풀었다.

2. 재귀함수를 통해 모든 경우의 수를 백트래킹으로 탐색하지만 그 중에서 이미 탐색했던 부분이 있으면 그 곳은 다시 탐색하지 않는다.

 

3. 좌표(N,M)에 도착하면 결과값에 return값에 1씩 더해준다.

 

#include <iostream>
#include <cstring>

using namespace std;

int dx[4] = {0,0,-1,1}; // 상하좌우 
int dy[4] = {1,-1,0,0};

int arr[500][500];
int cache[500][500];

int N,M;

int func(int x, int y){	
	if(cache[x][y] != -1) return cache[x][y];
	if(x == M-1 && y == N-1) return 1;
	
	cache[x][y] = 0;
	for(int i = 0; i<4; i++){
		int rx = x + dx[i];
		int ry = y + dy[i];
		if(rx >= 0 && ry >= 0 && rx < M && ry < N && arr[x][y] > arr[rx][ry]){
			cache[x][y] += func(rx,ry);
		}
	}
	return cache[x][y];
}

int main(){
	ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin>> M >> N;
	
	memset(cache,-1,sizeof(cache));
	
	for(int i = 0; i<M; i++){
		for(int j = 0; j<N; j++){
			cin >> arr[i][j];
		}
	}
	
	cout << func(0,0);
}

'알고리즘' 카테고리의 다른 글

[C++] BOJ-1699  (0) 2019.10.11
[C++] BOJ-1654  (0) 2019.10.11
[C++] BOJ-1238  (0) 2019.10.11
[C++] BOJ-1012  (0) 2019.10.11
[C++] BOJ-1012  (0) 2019.10.11