๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90
๐Ÿ”—๋ฌธ์ œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
 

11048๋ฒˆ: ์ด๋™ํ•˜๊ธฐ

์ค€๊ทœ๋Š” N×M ํฌ๊ธฐ์˜ ๋ฏธ๋กœ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” 1×1ํฌ๊ธฐ์˜ ๋ฐฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๊ณ , ๊ฐ ๋ฐฉ์—๋Š” ์‚ฌํƒ•์ด ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ— ๋ฐฉ์€ (1, 1)์ด๊ณ , ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋žซ ๋ฐฉ์€ (N, M)์ด๋‹ค. ์ค€๊ทœ๋Š”

www.acmicpc.net

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ปํ’€์ด ๊ณผ์ •

DP(Dynamic Programming)๋กœ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. (0, 0)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 0ํ–‰๊ณผ 0์—ด์— ๋Œ€ํ•ด ๋ˆ„์ ํ•ฉ์„ ์ €์žฅํ•ด ๋‚˜๊ฐ€๋ฉฐ, ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1๋ฒˆ์„ ์˜ˆ๋กœ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ฉ๋‹ˆ๋‹ค.

// ์›๋ณธ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ
1 2 3 4
0 0 0 5
9 8 7 6

// ๋ˆ„์ ํ•ฉ ์ ์šฉ ํ›„
1        3(2+1)  6(3+3)  10(6+4)
1 (0+1)  0       0       5
10(9+1)  8       7       6

 

2. 1ํ–‰ 1์—ด๋ถ€ํ„ฐ ์—ด๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉฐ, {์œ„์ชฝ, ์™ผ์ชฝ, ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„ } ์ค‘์— (์ œ์ผ ํฐ ๊ฐ’ + ํ˜„์žฌ ๊ฐ’)์„ ๋”ํ•ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ์—์„œ ์ด๋™ ๋ฐฉํ–ฅ์ด {์•„๋ž˜์ชฝ, ์˜ค๋ฅธ์ชฝ, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ๋Œ€๊ฐ์„ } ์ด๋ ‡๊ฒŒ ์„ธ ๊ฐœ์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ƒ๊ฐํ•˜๋ฉด, {์œ„์ชฝ, ์™ผ์ชฝ, ์™ผ์ชฝ ์œ„ ๋Œ€๊ฐ์„ }์—๋Š” ๊ฐ๊ฐ ์ด๋•Œ๊นŒ์ง€์˜ ๋ˆ„์ ํ•ฉ์ด ์กด์žฌํ•œ๋‹จ ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ด์ค‘์— ๊ฐ€์žฅ ํฐ ๋ˆ„์ ํ•ฉ๊ณผ ํ˜„์žฌ ๊ฐ’์„ ๋”ํ•ด ํ˜„์žฌ ์œ„์น˜์— ์ €์žฅํ•˜๋Š” ์‹์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1   3                      6                      10
1   3{0 + max(3, 1, 1)}    6{0 + max(6, 3, 3)}    15{5 + max(10, 6, 6)}
10  18{8 + max(3, 10, 1)}  25{7 + max(6, 18, 3)}  31{6 + max(15, 25, 6})

์ด๋Ÿฐ ์‹์œผ๋กœ ์ฐพ์•„๊ฐ€๋ฉด, [N-1][M-1]์— ์ตœ๋Œ“๊ฐ’์ด ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

โœ๏ธ์†Œ์Šค ์ฝ”๋“œ ๋ฐ ๊ฒฐ๊ณผ

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int FindMaxCandyCount(vector<vector<int>>& maze, int N, int M)
{
	// 0ํ–‰ ๋ˆ„์ ํ•ฉ ์ ์šฉ
	for (int row = 1; row < N; row++)
		maze[row][0] += maze[row - 1][0];

	// 0์—ด ๋ˆ„์ ํ•ฉ ์ ์šฉ
	for (int col = 1; col < M; col++)
		maze[0][col] += maze[0][col - 1];

	// {์œ„์ชฝ, ์™ผ์ชฝ, ๋Œ€๊ฐ์„  ์™ผ์ชฝ ์œ„} ์ค‘์— ์ œ์ผ ํฐ ์ˆ˜์™€ ํ˜„์žฌ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ ์ €์žฅ
	for (int row = 1; row < N; row++)
		for (int col = 1; col < M; col++)
			maze[row][col] += max({ maze[row - 1][col], maze[row][col - 1], maze[row - 1][col - 1] });
	return maze[N - 1][M - 1];
}

int main()
{
	ios::sync_with_stdio(false);
	cout.tie(NULL); cin.tie(NULL);

	int N, M;
	cin >> N >> M;
	
	vector<vector<int>> maze(N, vector<int>(M));
	for (int r = 0; r < N; r++)
		for (int c = 0; c < M; c++)
			cin >> maze[r][c];

	int answer = FindMaxCandyCount(maze, N, M);
	cout << answer;
	return 0;
}

 

 

728x90
๋ฐ˜์‘ํ˜•