Improve solution of problem 18

This commit is contained in:
daniele 2019-09-23 08:47:23 +02:00
parent 8338e81670
commit 593d52144d
Signed by: fuxino
GPG Key ID: 6FE25B4A3EE16FDA
3 changed files with 52 additions and 22 deletions

View File

@ -1,14 +1,41 @@
/* 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)*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sum_triangle(int **triang, int n, int i, int j, int sum);
int max = 0;
#include "projecteuler.h"
int main(int argc, char **argv)
{
int i, j;
int i, j, max;
int **triang;
double elapsed;
FILE *fp;
@ -47,7 +74,7 @@ int main(int argc, char **argv)
fclose(fp);
sum_triangle(triang, 15, 0, 0, 0);
max = find_max_path(triang, 15);
clock_gettime(CLOCK_MONOTONIC, &end);
@ -60,19 +87,3 @@ int main(int argc, char **argv)
return 0;
}
void sum_triangle(int **triang, int n, int i, int j, int sum)
{
if(i == n)
{
if(sum > max)
{
max = sum;
}
return;
}
sum_triangle(triang, n, i+1, j, sum+triang[i][j]);
sum_triangle(triang, n, i+1, j+1, sum+triang[i][j]);
}

View File

@ -188,6 +188,24 @@ int count_divisors(int n)
return count;
}
int find_max_path(int **triang, int n)
{
int i, j;
for(i = n - 2; i >= 0; i--)
{
for(j = 0; j <= i; j++)
{
if(triang[i+1][j] > triang[i+1][j+1])
triang[i][j] += triang[i+1][j];
else
triang[i][j] += triang[i+1][j+1];
}
}
return triang[0][0];
}
void insertion_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv))
{
int i, j;

View File

@ -8,6 +8,7 @@ long int lcm(long int a, long int b);
long int lcmm(long int *values, int n);
int *sieve(int n);
int count_divisors(int n);
int find_max_path(int **triang, int n);
void insertion_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv));
void quick_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv));
int is_pandigital(int value, int n);