Skip to content

Commit c923ab2

Browse files
Triangle
Signed-off-by: Leo Ma <[email protected]>
1 parent 2fde4f6 commit c923ab2

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

120_triangle/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
all:
2+
gcc -O2 -o test triangle.c

120_triangle/triangle.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <stdbool.h>
4+
#include <string.h>
5+
6+
static int recursive(int** triangle, int row_size, int *col_sizes,
7+
int row, int col, int **sums, bool **passes)
8+
{
9+
if (row == row_size - 1) {
10+
return triangle[row][col];
11+
} else if (passes[row][col]) {
12+
return sums[row][col];
13+
} else {
14+
int s1 = recursive(triangle, row_size, col_sizes, row + 1, col, sums, passes);
15+
int s2 = recursive(triangle, row_size, col_sizes, row + 1, col + 1, sums, passes);
16+
sums[row][col] = triangle[row][col] + (s1 < s2 ? s1 : s2);
17+
passes[row][col] = true;
18+
return sums[row][col];
19+
}
20+
}
21+
22+
static int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes)
23+
{
24+
int i;
25+
bool **passes = malloc(triangleRowSize * sizeof(bool *));
26+
for (i = 0; i < triangleRowSize; i++) {
27+
passes[i] = malloc(triangleColSizes[i]);
28+
memset(passes[i], false, triangleColSizes[i]);
29+
}
30+
int **sums = malloc(triangleRowSize * sizeof(int *));
31+
for (i = 0; i < triangleRowSize; i++) {
32+
sums[i] = malloc(triangleColSizes[i] * sizeof(int));
33+
}
34+
return recursive(triangle, triangleRowSize, triangleColSizes, 0, 0, sums, passes);
35+
}
36+
37+
int main(void)
38+
{
39+
int i, row = 4;
40+
int **nums = malloc(row * sizeof(int *));
41+
int *sizes = malloc(row * sizeof(int));
42+
for (i = 0; i < row; i++) {
43+
sizes[i] = i + 1;
44+
nums[i] = malloc(sizes[i] * sizeof(int));
45+
}
46+
#if 0
47+
nums[0][0] = -1;
48+
nums[1][0] = 3;
49+
nums[1][1] = 2;
50+
nums[2][0] = -3;
51+
nums[2][1] = 1;
52+
nums[2][2] = -1;
53+
#else
54+
nums[0][0] = 2;
55+
nums[1][0] = 3;
56+
nums[1][1] = 4;
57+
nums[2][0] = 6;
58+
nums[2][1] = 5;
59+
nums[2][2] = 7;
60+
nums[3][0] = 4;
61+
nums[3][1] = 1;
62+
nums[3][2] = 8;
63+
nums[3][3] = 3;
64+
#endif
65+
printf("%d\n", minimumTotal(nums, row, sizes));
66+
return 0;
67+
}

0 commit comments

Comments
 (0)