矩陣最短路徑-動態規劃算法

#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;

}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章