Hello Ocean! ๐ŸŒผ

[๋ฐฑ์ค€/C++] 1520. ๋‚ด๋ฆฌ๋ง‰ ๊ธธ ๋ณธ๋ฌธ

Algorithm

[๋ฐฑ์ค€/C++] 1520. ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

bba_dda 2021. 3. 14. 23:11
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

www.acmicpc.net/problem/1520

 

1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

์—ฌํ–‰์„ ๋– ๋‚œ ์„ธ์ค€์ด๋Š” ์ง€๋„๋ฅผ ํ•˜๋‚˜ ๊ตฌํ•˜์˜€๋‹ค. ์ด ์ง€๋„๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์€ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ๊ฐ ์นธ์—๋Š” ๊ทธ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์“ฐ์—ฌ ์žˆ์œผ

www.acmicpc.net

ํ’€์ด

 ์ฒ˜์Œ์—๋Š” DP๋งŒ ์ด์šฉํ•ด์„œ, cache[i][j]์— (i,j) ์œ„์น˜๊นŒ์ง€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋‚ด๋ฆฌ๋ง‰๊ธธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ƒํ•˜์ขŒ์šฐ๋กœ ๋ชจ๋‘ ์ด๋™์ด ๊ฐ€๋Šฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์€ ์‹คํŒจํ–ˆ๋‹ค.

 ๋‘ ๋ฒˆ์งธ ์ƒ๊ฐ๋‚œ ๋ฐฉ๋ฒ•์€, ์ตœ๋‹จ๊ฒฝ๋กœ์ฐพ๊ธฐ ๋ฌธ์ œ๋กœ ํ•ด์„ํ•ด์„œ BFS๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋‹ค. 

ํ•˜์ง€๋งŒ, ์‹œ๊ฐ„์ดˆ๊ณผ ๋•Œ๋ฌธ์— ์ด ๋ฐฉ๋ฒ•์€ ์‹คํŒจํ–ˆ๋‹ค.

 

 ์ตœ์ข… ๋ฐฉ๋ฒ•์€, DFS์— DP๋ฅผ ์ ‘๋ชฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. DFS๋กœ ํƒ์ƒ‰ํ•˜๋˜, DP์˜ ๋ฉ”๋ชจ๋ฆฌ์ œ์ด์…˜์„ ์ ‘๋ชฉํ•œ ๊ฒƒ์ด๋‹ค.

cache[i][j] : (i,j) ์œ„์น˜ ๋ถ€ํ„ฐ, ๋งจ ์™ผ์ชฝ ๋งจ ์•„๋ž˜(๋„์ฐฉ์ง€์ ) ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋‚ด๋ฆฌ๋ง‰๊ธธ ๊ฒฝ์šฐ์˜ ์ˆ˜ 

์ฆ‰, DFS ํƒ์ƒ‰๊ณผ์ •์ค‘์—, ์ด์ „์— ํƒ์ƒ‰ํ–ˆ๋˜ ์ขŒํ‘œ์— ๋‹ค์‹œ ๋„๋‹ฌํ•  ๊ฒฝ์šฐ, ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  cache๊ฐ’์„ ์ด์šฉํ•ด์„œ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. 

  • cache๋ฅผ -1๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์—ˆ๋‹ค. 
    • cache๊ฐ’์ด 0์ผ ๋•Œ, ํƒ์ƒ‰ํ•œ ์ ์ด ์—†๋Š” ์ขŒํ‘œ๊ฐ€ ์•„๋‹ˆ๋ผ ํƒ์ƒ‰ํ•ด๋ดค๋Š”๋ฐ ๊ฒฝ๋กœ๊ฐ€ 0๊ฐœ๋”๋ผ ๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰ํ•œ ์ ์ด ์—†๋Š” ์ขŒํ‘œ๋ฅผ -1๋กœ ๊ตฌ๋ถ„ํ•ด์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค. 
  • DFS๋Š” ์žฌ๊ท€๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
int table[501][501];
int cache[501][501];

// U, D, L, R
int dc[4] = { -1,1,0,0 };
int dr[4] = { 0,0,-1,1 };

int dfs(int c, int r) { 
	if (r == n - 1 && c == m - 1) // ๋ชฉ์ ์ง€์— ๋„์ฐฉ (๋)
		return 1;
	if (cache[c][r] != -1) // ์ด์ „์— ๋ฐฉ๋ฌธํ•œ์ ์ด ์žˆ์œผ๋ฉด, cache return
		return cache[c][r];

	cache[c][r] = 0; // ๋ฐฉ๋ฌธ ํ‘œ์‹œ 
	int temp = table[c][r]; 
	for (int i = 0;i < 4;i++) { // ์ƒํ•˜์ขŒ์šฐ
		int nc = c + dc[i];
		int nr = r + dr[i];
		if (nc >= 0 && nc < m && nr >= 0 && nr < n) { 
			if (table[nc][nr] < temp)
				cache[c][r] += dfs(nc, nr);
		}
	}
	return cache[c][r];
}
int main(void) {
	cin >> m >> n;
	fill(&cache[0][0], &cache[500][501], -1); // -1๋กœ ์ดˆ๊ธฐํ™”

	for (int i = 0;i < m;i++) {
		for (int j = 0;j < n;j++) {
			cin >> table[i][j];
		}
	}
	int answer = dfs(0, 0);
	cout << answer << endl;
	return 0;
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•