60 lines
1.8 KiB
C
60 lines
1.8 KiB
C
#define MIN(a, b) (a > b ? b : a)
|
|
int minimumTotal(int **triangle, int triangleRowSize, int *triangleColSizes) {
|
|
int **dp = malloc(sizeof(int *) * triangleRowSize), ret = 0;
|
|
for (int i = 0; i < triangleRowSize; i++) {
|
|
dp[i] = malloc(sizeof(int) * triangleRowSize);
|
|
}
|
|
dp[0][0] = triangle[0][0];
|
|
for (int i = 1; i < triangleRowSize; i++) {
|
|
for (int n = 0; n <= i; n++) {
|
|
if (n == 0) {
|
|
dp[i][n] = dp[i - 1][n];
|
|
} else if (n == i) {
|
|
dp[i][n] = dp[i - 1][n - 1];
|
|
} else {
|
|
dp[i][n] = MIN(dp[i - 1][n], dp[i - 1][n - 1]);
|
|
}
|
|
dp[i][n] += triangle[i][n];
|
|
}
|
|
}
|
|
ret = dp[triangleRowSize - 1][0];
|
|
for (int i = 1; i < triangleRowSize; i++) {
|
|
ret = MIN(ret, dp[triangleRowSize - 1][i]);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
int minimumSubTotal(int** triangle, int triangleRowSize, int *triangleColSizes, int level, int* minTotal) {
|
|
int i = 0;
|
|
int min = INT_MAX;
|
|
int res = 0;
|
|
int temp = 0;
|
|
if(level == triangleRowSize - 1){
|
|
for(i = 0; i <= level; i++){
|
|
minTotal[i] = triangle[level][i];
|
|
min = minTotal[i] < min ? minTotal[i] : min;
|
|
}
|
|
return min;
|
|
}
|
|
minimumSubTotal(triangle, triangleRowSize, triangleColSizes, level + 1, minTotal);
|
|
|
|
for(i = 0, temp = minTotal[0]; i <= level; i++){
|
|
res = (temp > minTotal[i + 1] ? minTotal[i + 1] : temp) + triangle[level][i];
|
|
temp = minTotal[i + 1];
|
|
minTotal[i] = res;
|
|
min = minTotal[i] < min ? minTotal[i] : min;
|
|
}
|
|
|
|
return min;
|
|
}
|
|
|
|
int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes) {
|
|
int ret = 0;
|
|
int* minTotal = (int*)malloc(sizeof(int) * triangleRowSize);
|
|
ret = minimumSubTotal(triangle, triangleRowSize, triangleColSizes, 0, minTotal);
|
|
free(minTotal);
|
|
|
|
return ret;
|
|
}
|
|
*/ |