Improve solution of problem 18
This commit is contained in:
parent
8338e81670
commit
593d52144d
55
C/p018.c
55
C/p018.c
@ -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]);
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user