From c923ab258312393194702eec026c1aac7cd773e8 Mon Sep 17 00:00:00 2001 From: Leo Ma Date: Sun, 5 Nov 2017 20:03:52 +0800 Subject: [PATCH] Triangle Signed-off-by: Leo Ma --- 120_triangle/Makefile | 2 ++ 120_triangle/triangle.c | 67 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 120_triangle/Makefile create mode 100644 120_triangle/triangle.c diff --git a/120_triangle/Makefile b/120_triangle/Makefile new file mode 100644 index 0000000..44d928f --- /dev/null +++ b/120_triangle/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test triangle.c diff --git a/120_triangle/triangle.c b/120_triangle/triangle.c new file mode 100644 index 0000000..430c425 --- /dev/null +++ b/120_triangle/triangle.c @@ -0,0 +1,67 @@ +#include +#include +#include +#include + +static int recursive(int** triangle, int row_size, int *col_sizes, + int row, int col, int **sums, bool **passes) +{ + if (row == row_size - 1) { + return triangle[row][col]; + } else if (passes[row][col]) { + return sums[row][col]; + } else { + int s1 = recursive(triangle, row_size, col_sizes, row + 1, col, sums, passes); + int s2 = recursive(triangle, row_size, col_sizes, row + 1, col + 1, sums, passes); + sums[row][col] = triangle[row][col] + (s1 < s2 ? s1 : s2); + passes[row][col] = true; + return sums[row][col]; + } +} + +static int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes) +{ + int i; + bool **passes = malloc(triangleRowSize * sizeof(bool *)); + for (i = 0; i < triangleRowSize; i++) { + passes[i] = malloc(triangleColSizes[i]); + memset(passes[i], false, triangleColSizes[i]); + } + int **sums = malloc(triangleRowSize * sizeof(int *)); + for (i = 0; i < triangleRowSize; i++) { + sums[i] = malloc(triangleColSizes[i] * sizeof(int)); + } + return recursive(triangle, triangleRowSize, triangleColSizes, 0, 0, sums, passes); +} + +int main(void) +{ + int i, row = 4; + int **nums = malloc(row * sizeof(int *)); + int *sizes = malloc(row * sizeof(int)); + for (i = 0; i < row; i++) { + sizes[i] = i + 1; + nums[i] = malloc(sizes[i] * sizeof(int)); + } +#if 0 + nums[0][0] = -1; + nums[1][0] = 3; + nums[1][1] = 2; + nums[2][0] = -3; + nums[2][1] = 1; + nums[2][2] = -1; +#else + nums[0][0] = 2; + nums[1][0] = 3; + nums[1][1] = 4; + nums[2][0] = 6; + nums[2][1] = 5; + nums[2][2] = 7; + nums[3][0] = 4; + nums[3][1] = 1; + nums[3][2] = 8; + nums[3][3] = 3; +#endif + printf("%d\n", minimumTotal(nums, row, sizes)); + return 0; +}