By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.
3
7 4
2 4 6
8 5 9 3
That is, 3 + 7 + 4 + 9 = 23.
Find the maximum total from top to bottom of the triangle below:
75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23
NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)
출처: https://projecteuler.net/problem=18
삼각형의 꼭대기부터 아래쪽으로 인접한 숫자를 찾아 내려가면서 합을 구한다고 할 때 가장 합을 구하는 문제입니다.
삼각형의 제일 밑에서부터 올라가며 더하는 방법과 memoization 을 통해 시간 복잡도를 줄이고, y 축의 배열은 모두 저장할 필요 없이 바로 밑에 칸의 값만 가지고 있으면 된다는 점을 통해 공간 복잡도를 줄였습니다.
my solving
c++
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 | #include <fstream> #include <iostream> #include <algorithm> #include <vector> using namespace std; const int MAX = 15; int numbers[MAX][MAX]; int cache[2][MAX]; int dynamicProgramming() { for (int x = 0; x < MAX; x++) cache[(MAX - 1) % 2][x] = numbers[MAX - 1][x]; for (int y = MAX - 2; y >= 0; y--) { for (int x = 0; x < y + 1; x++) cache[y % 2][x] = max(cache[(y + 1) % 2][x], cache[(y + 1) % 2][x + 1]) + numbers[y][x]; } return cache[0][0]; } int main() { ifstream fin("input.in"); for (int i = 0; i < MAX; i++) { for (int j = 0; j < i + 1; j++) fin >> numbers[i][j]; } cout << dynamicProgramming() << endl; fin.close(); system("pause"); return 0; } | cs |
'Algorithm, Data structure > Solved Algorithmic Problem' 카테고리의 다른 글
USACO 1.4 - Mother's Milk (1) | 2016.06.26 |
---|---|
USACO 1.4 - Arithmetic Progressions (0) | 2016.06.26 |
Project Euler #16 - Power digit sum (0) | 2016.06.21 |
Codility #1 - BinaryGap (0) | 2016.06.21 |
USACO 1.3 - Ski Course Design (0) | 2016.06.18 |