2024-03-19 02:45:09 +08:00

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;
}
*/