#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MIN_VAL(x, y) ((x) > (y) ? (y) : (x))
#define MAX_LEN 10
int **record;
// 從最右下角的節點開始動態規劃,遞歸過程,把遞歸過程記錄下來即爲動態規劃。
int MinSum(int** grid, int gridSize, int* gridColSize, int i, int j)
{
int result;
for(int i = gridSize - 1; i >= 0; i--)
{
for (int j = *gridColSize - 1; j >= 0; j--)
{
if ((i == gridSize - 1) && (j == *gridColSize - 1))
{
result = grid[i][j];
}
else if (i == gridSize - 1)
{
result = record[i][j + 1] + grid[i][j];
}
else if (j == gridSize - 1)
{
result = record[i + 1][j] + grid[i][j];
}
else
{
result = MIN_VAL((record[i + 1][j]), (record[i][j + 1])) + grid[i][j];
}
record[i][j] = result;
printf("%d \n", result);
}
}
return record[0][0];
}
int minPathSum(int** grid, int gridSize, int* gridColSize){
int result;
record = (int **)malloc(sizeof(int *) * gridSize);
for (int i = 0; i < gridSize; i++)
{
record[i] = (int *)malloc(sizeof(int) * (*gridColSize));
}
result = MinSum(grid, gridSize, gridColSize, 0, 0);
// for (int i = 0; i < gridSize; i++)
// {
// if (record[i] != NULL)
// {
// free(record[i]);
// record[i] = NULL;
// }
// }
if (record != NULL)
{
free(record);
record = NULL;
}
return result;
}
int main()
{
int m = 2;
int n = 2;
int **a;
a = (int **)malloc(sizeof(int *) * m);
for (int i = 0; i < m; i++)
{
a[i] = (int *)malloc(sizeof(int) * n);
}
// a[0][0] = 1;
// a[0][1] = 3;
// a[0][2] = 1;
// a[1][0] = 1;
// a[1][1] = 5;
// a[1][2] = 1;
// a[2][0] = 4;
// a[2][1] = 2;
// a[2][2] = 1;
a[0][0] = 1;
a[0][1] = 2;
a[0][2] = 5;
a[1][0] = 3;
a[1][1] = 2;
a[1][2] = 1;
// printf("%d \n", record[2][2]);
// 二維數組不能傳遞給二級指針
printf("result %d \n", minPathSum(a, m, &n));
// for (int i = 1; i < m; i++)
// {
// if (a[i] != NULL)
// {
// free(a[i]);
// a[i] = NULL;
// }
// }
if (a != NULL)
{
free(a);
a = NULL;
}
system("pause");
return 0;
}