簡體   English   中英

最大和尋路的動態規划解

[英]dynamic programming solution on path finding with maximum sum

問題是我有一個由數字填充的 2 * n 數組。 我想從 (0,0) 單元格開始向右、向上或向下移動以到達 (1,n) 單元格。 每個單元格最多應該被訪問一次,並且路徑中的數字總和應該是最大的。 例如,如果我有這個數組:

1 2 5
-1 3 4

動作應該是向下,向右,向上,向右,向下。 所以最大和是 1 + (-1) + 3 + 2 + 5 + 4 = 14

我試圖通過找到每列的最大元素來使用動態編程來解決問題,但這沒有用。 我的解決方案是這樣的:

dp[0][0] = arr[0][0];
dp[1][0] = arr[1][0] + arr[0][0];
for (int i = 1; i < n; i++) {
    // here we predict 4 numbers and find the maximum one
    // so we can get maximum score on each column
    int predicta1 = arr[1][i] + dp[1][i - 1]; // predict for 1,i (down)
    int predicta2 = predicta1 + arr[0][i];    // predict for 0,i (up)

    int predictb1 = arr[1][i] + arr[0][i] + dp[0][i - 1]; // predict for 1,i (down)
    int predictb2 = arr[0][i] + dp[0][i - 1]; // predict for 0,i (up)
    int maximum = max(predicta1, max(predicta2, max(predictb1, predictb2)));
}

誰能幫助如何使用 DP 或任何其他方法解決這個問題?

你離解決方案不遠了。 這個想法是利用我們不能 go 到左邊的事實。

我們迭代地計算 position [0][i][1][i]處的最大值。 例如:

Max at [1][i] = max (Max at [1][i-1] + A[1][i], Max at [0][i-1] + A[0][i] + A[1][i]);

等等。

#include <iostream>
#include <vector>
#include <algorithm>

int path2 (std::vector<std::vector<int>>& A) {
    int n = A[0].size();
    if (n == 0) return 0;
    int predit0 = A[0][0];
    int predit1 = A[0][0] + A[1][0];
    
    for (int i = 1; i < n; ++i) {
        int sum = A[0][i] + A[1][i];
        int temp = std::max (predit0 + A[0][i], predit1 + sum);
        predit1 = std::max (predit1 + A[1][i], predit0 + sum);
        predit0 = temp;
    }
    return predit1;
}

int main() {
    std::vector<std::vector<int>> A = {
        {1, 2, 5},
        {-1, 3, 4}
    };
    auto ans = path2(A);
    std::cout << "max sum = " << ans << std::endl;
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM