【问题标题】:Dynamic programming problem -Minimum Cost Path动态规划问题 - 最小成本路径
【发布时间】:2020-10-03 03:31:04
【问题描述】:

我正在尝试这个问题 - Minimum Cost Path。 我已经使用 Dijkstra 的最短路径算法解决了这个问题。但是当我尝试使用递归+记忆,即使用动态编程时,我卡住了,无法调试我的代码。我需要关于我的代码哪里出错的帮助!!

我真的很高兴能得到帮助。

#include<bits/stdc++.h>

using namespace std;

int n;
int a[105][105], dp[105][105];

int dfs(int x, int y){
    if(x < 0 || y < 0 || x >= n || y >= n){
        return INT_MAX;
    }
    if(x == 0 && y== 0){
        return a[0][0];
    }
    if(dp[x][y] != -1){
        return dp[x][y];
    }
    dp[x][y] = a[x][y] + min(dfs(x-1, y), min(dfs(x, y-1), min(dfs(x+1, y), dfs(x, y+1))));
    return dp[x][y];
}


int main(){
    int tt;
    cin >> tt;
    while(tt--){
        int n;
        cin >> n;
        for(int i = 0 ; i < n; i++){
            for(int j = 0; j < n; j++){
                cin >> a[i][j];
                dp[i][j] = -1;
            }
        }
        cout << dfs(n-1, n-1) << endl;
    }
    return 0;
}



Example:
Input:
2
5
31 100 65 12 18 10 13 47 157 6 100 113 174 11 33 88 124 41 20 140 99 32 111 41 20
2
42 93 7 14

Output:
327
63

我得到 2147483647 作为这两种情况的输出,即 INT_MAX 的值。

【问题讨论】:

  • 请输入示例输入和预期输出,并尝试解释您遇到的问题
  • 您可以在提供的链接中找到示例输入输出。我将输出作为所有测试用例的 INT_MAX 值。
  • 请在问题中提供minimal reproducible example,不要依赖外部链接
  • 在编辑后的帖子中提供了一个示例。希望对您有所帮助。

标签: c++ recursion c++14 dynamic-programming shortest-path


【解决方案1】:

dfs 查看的全局变量n 始终为零(通过静态初始化),它从未被赋值。当main 调用dfs(4, 4) 时,由于4 &gt;= 0 检查,该函数立即返回INT_MAX


一旦你解决了这个简单的问题,你会发现你的程序由于堆栈溢出而崩溃。你看,dfs(4, 4) 调用dfs(3, 4),后者又调用dfs(4, 4),后者又调用dfs(3, 4),后者...

这并不是一个真正的动态规划问题。这是一个“图中最短路径”问题,适用于例如 Dijkstra 或 A* 算法。

【讨论】:

  • 谢谢!!这有助于我尝试更改 n 的静态初始化并了解我错在哪里。是的,我已经使用 dijkstra 最短路径算法解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2021-06-18
相关资源
最近更新 更多