動態規划之倉鼠吃豆子


動態規划之倉鼠吃豆子

【題目】m * n的方格上,每一格存放一定數量的豆子,一只倉鼠從左下角一直吃到右上角,但倉鼠只能向右或向上走。那么倉鼠做多可以吃多少豆子?
【思路】因為倉鼠只能向左或者向上走,那么到達任意一點的豆子數量由兩部分組成:該點本身的豆子beans(x,y),max{到達左邊的豆子總數path(x-1,y), 到達下方的豆子總數path(x, y-1)}。
於是得到到達任意一點的豆子總數的公式P(x,y) = F(x,y) + max(P(x-1, y), P(x, y-1))。計算並記錄每個點的豆子總數,同時為了避免重復計算,將計算的中間結果存儲在path數組中。
【注意】

  1. 因為矩陣原點在左上角,需要對公式進行變換。P(x,y) = F(x,y) + max(P(x+1, y), P(x, y-1));
  2. 注意邊界值,這里需要注意三點,左下角的點、左邊界、下邊界。
#include <stdio.h>
#include <stdlib.h>

int max(int a, int b) {
    if (a > b)
        return a;
    return b;
}

int main() {
    int m, n;
    int i, j;
    int **beans;
    int **path;

    scanf("%d %d", &m, &n); /* m * n矩陣 */

    beans = (int**)malloc(sizeof(void*) * m);
    path = (int**)malloc(sizeof(void*) * m);

    for (i = 0; i < m; i++) {
        beans[i] = (int*)malloc(sizeof(int) * n);
        path[i] = (int*)malloc(sizeof(int) * n);
    }

    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &beans[i][j]);
        }
    }

    printf("Beans:\n"); 
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            printf("%3d ", beans[i][j]); /* 顯示矩陣上豆子數 */
        }
        printf("\n");
    }

    for (i = m - 1; i >= 0; i--) { /* to up */
        for (j = 0; j < n; j++) { /* to right */
            if (i == m - 1 && j == 0) { /* 左下角 */
                path[i][j] = beans[i][j];
            } else if (i != m - 1 && j == 0) { /* 左邊界 */
                path[i][j] = beans[i][j] + path[i+1][j];
            } else if (i == m - 1 && j != 0) { /* 下邊界 */
                path[i][j] = beans[i][j] + path[i][j-1];
            } else { /* 一般情況 */
                path[i][j] = beans[i][j] + max(path[i+1][j], path[i][j-1]);
            }
        }
    }

    printf("Path:\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            printf("%3d ", path[i][j]);
        }
        printf("\n");
    }
    printf("max path:%d\n", path[0][n-1]);

    for (i = 0; i < m; i++) {
        free(beans[i]);
        free(path[i]);
    }

    free(path);
    free(beans);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM