최대 1 분 소요

Intro

image

image

문제해결 및 소스코드

  • 처음에 문제를 보고 DFS로 풀어봤다. 하지만 시간초과가 발생했다.

  • 문제를 다시한번 풀어써보고, DP로 풀어보기로했다.

image

  • 예시로, 이 문제는 미로의 (1,1)부터 시작하여 (3,4)까지 가면서, 각 미로좌표의 숫자(사탕수)를 더해나가며

  • 목적지(3,4)에 도달했을 때 더해진 숫자의 최대값을 구하는 문제이다.

  • 특징은 나아갈 수 있는 방향이 반드시 우하향 이라는것이다.

image

  • 예를들어, (2,2)에서의 최대 사탕갯수는 몇개일까?
    • (2,2)를 가는 방법은 그림에서와 같이 3가지이다.
    • 따라서 3가지 경로중 최대값을 (2,2)에 작성해주면 된다.
  • maxCandies라는 배열을 만들어, 여기에 각 좌표까지에서 획득할 수 있는 최대 사탕수를 저장했다.
#include <iostream>
#include <algorithm>

using namespace std;

int maxCandies[1001][1001];	
int maze[1001][1001];

int main()
{
	int n, m;
	cin >> n >> m;

	// 입력
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= m;j++)
		{
			cin >> maze[i][j];
		}
	}

	// DP동작
	for (int i = 1;i <= n;i++)
	{
		for (int j = 1;j <= m;j++)
		{
			// 우->하, 하->우, 대각선 방향으로 탐색하는것 중 가장큰 값
			maxCandies[i][j] = max(max(maxCandies[i][j - 1], maxCandies[i - 1][j]), maxCandies[i - 1][j - 1]) + maze[i][j];
		}
	}

	cout << maxCandies[n][m];
}

댓글남기기