거의 알고리즘 일기장

알고스팟 _ 삼각형 위의 최대 경로 본문

알고리즘 문제풀이

알고스팟 _ 삼각형 위의 최대 경로

건우권 2020. 5. 8. 02:55

https://algospot.com/judge/problem/read/TRIANGLEPATH

 

algospot.com :: TRIANGLEPATH

삼각형 위의 최대 경로 문제 정보 문제 6 1 2 3 7 4 9 4 1 7 2 7 5 9 4 위 형태와 같이 삼각형 모양으로 배치된 자연수들이 있습니다. 맨 위의 숫자에서 시작해, 한 번에 한 칸씩 아래로 내려가 맨 아래 줄로 내려가는 경로를 만들려고 합니다. 경로는 아래 줄로 내려갈 때마다 바로 아래 숫자, 혹은 오른쪽 아래 숫자로 내려갈 수 있습니다. 이 때 모든 경로 중 포함된 숫자의 최대 합을 찾는 프로그램을 작성하세요. 입력 입력의 첫 줄에는 테

algospot.com

 접근

 시간 : 5초, 테스트케이스 : 최대 50개, n : 최대 100

 

 딱봐도 이 문제는 완전탐색으로 풀기에는 중복되는 연산이 많다. 저번 포스팅들에서 이것과 흡사한 문제들이 왜 시간이 안되는지 여러번 설명했기 때문에 왜 시간초과인지는 생략하도록 하겠다. 이 문제도 전형적인 동적계획법 문제처럼 중복되는 계산이 많다. 이 중복되는 연산을 줄이기 위해서 메모라이즈 기법을 사용하자!


 풀이방법

 위에서 설명했던것처럼 중복되는 연산을 막기위해서 메모라이즈 방식이 사용하겠다.

 cache[][]배열 ( -1 : 아직 계산안함, 그외 : 계산된 값 ) 을 만들고 이를 이용해서 아래와 아래 오른쪽중에 큰값을 받자.

//바로 아래숫자, 오른쪽 아래 숫자 체크
for (int i = 0; i < 2; i++)
	ret = max(ret, getMaxSum(h + 1, w + i));
	
ret += triangle[h][w];

 

 혹시 설명이 너무짧아 이해가 안간다면 비슷한 유형의 문제를 리뷰해놓았으니 보면 좋을것같다.

https://kunkunwoo.tistory.com/110

 

백준 2098번 _ 외판원 순회

https://www.acmicpc.net/problem/2098 2098번: 외판원 순회 첫째 줄에 도시의 수 N이 주어진다. (2 ≤ N ≤ 16) 다음 N개의 줄에는 비용 행렬이 주어진다. 각 행렬의 성분은 1,000,000 이하의 양의 정수이며,..

kunkunwoo.tistory.com


 전체코드

#include <iostream>
#include <algorithm>

using namespace std;
int triangle[101][101];
int cache[101][101];
int n;

void cacheInit()
{
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			cache[i][j] = -1;
}

void Input()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			cin >> triangle[i][j];
}

int getMaxSum(int h, int w)
{
	int& ret = cache[h][w];
	if (ret != -1) return ret;

	//다내려왔을때
	if (h == n)
		return triangle[h][w];

	//바로 아래숫자, 오른쪽 아래 숫자 체크
	for (int i = 0; i < 2; i++)
		ret = max(ret, getMaxSum(h + 1, w + i));
	
	ret += triangle[h][w];

	return ret;
}

int main()
{
	int testcase;
	cin >> testcase;
	for (int i = 0; i < testcase; i++)
	{
		Input();
		cacheInit();
		cout << getMaxSum(1, 1) << '\n';
	}
	return 0;
}

 후기

 침대에 누워 종만북을 보다가 이건 간단히 풀고 잘수있을것 같아 컴퓨터를 켜서 풀고 리뷰까지 해보았다. 금방 풀려서 다행이다.

 

 이제 자야지 히히

반응형
Comments