거의 알고리즘 일기장
알고스팟 _ 삼각형 위의 최대 경로 본문
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;
}
후기
침대에 누워 종만북을 보다가 이건 간단히 풀고 잘수있을것 같아 컴퓨터를 켜서 풀고 리뷰까지 해보았다. 금방 풀려서 다행이다.
이제 자야지 히히
'알고리즘 문제풀이' 카테고리의 다른 글
백준 9465번 _ 스티커 (0) | 2020.05.09 |
---|---|
알고스팟 _ LIS, 백준 12015번 _가장 긴 증가하는 부분 수열 2 (0) | 2020.05.08 |
codeforces _ 230B _ B. T-primes (0) | 2020.05.07 |
백준 1700번 _ 멀티탭 스케줄링 (0) | 2020.05.07 |
백준 11000번 _ 강의실 배정 (0) | 2020.05.07 |