반응형
삼각형 위의 최대 경로
여뗳게 풀까?
현재 위치에서의 최댓값에서 계속 다음 위치로의 최댓값을 갱신해 나가면 풀 수 있습니다.
그림의 예를 통해 어떻게 문제가 해결되는지 확인해봅시다.
코드로는 어떻게 표현할 수 있을까요?
현재 위치의 값을 memoi[y][x] 라고 한다면,
다음 위치의 값 memoi[y + 1][x] 은 memoi[y + 1][x]와 memoi[y][x] 중 큰 값과 삼각형에 들어있는 triangle[y + 1][x] 을 더한 값이 됩니다.
이는, memoi[y + 1][x + 1]에서도 마찬가지입니다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #pragma once #include<cstdio> #include<cstring> int triangle[101][101]; int memoi[101][102], n; int max(int i1, int i2) { return i1 > i2 ? i1 : i2; } void init() { scanf("%d\n", &n); memset(memoi, 0, sizeof(memoi)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { scanf("%d\n", &triangle[i][j]); memoi[i][j] += triangle[i][j]; memoi[i + 1][j] = max(memoi[i][j], memoi[i + 1][j]); memoi[i + 1][j + 1] = max(memoi[i][j], memoi[i + 1][j + 1]); } } } int main() { int t; scanf("%d\n", &t); while (t--) { init(); int res = memoi[n][1]; for (int i = 2; i <= n; i++) { res = max(res, memoi[n][i]); } printf("%d\n", res); } return 0; } | cs |
여담
생각보다 그림 올리는게 되게 손이 많이 갑니다. 하지만 그림이 있기에 더 이해하기 쉬울것이라고 믿어 의심치 않습니다!
이왕 문제 풀이를 쓰는 김에 확실하게 쓰겠습니다!
반응형
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[알고스팟] 합친 LIS (0) | 2018.06.14 |
---|---|
[알고스팟] 최장 증가 부분 수열 LIS (longest increasing subsequence) (0) | 2018.06.14 |
[알고스팟] 와일드카드 (0) | 2018.06.12 |
[알고스팟] 외발 뛰기 (0) | 2018.06.12 |
[알고스팟] 팬 미팅 (0) | 2018.06.11 |