Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算具有多个检查点的网格中的路径_C++_Algorithm - Fatal编程技术网

C++ 计算具有多个检查点的网格中的路径

C++ 计算具有多个检查点的网格中的路径,c++,algorithm,C++,Algorithm,给定一个大小为nxn的网格。它的左下角点是(0,0),右上角元素是(N-1,N-1) 我们可以沿顶部或右侧方向遍历网格。我们必须找到从左下角到右上角的遍历方式每条路径上都有一些检查点。至少有一个有效路径 示例:让N=5在(2,2)有一个检查点,然后这里的答案是36 注意:我只需要计算有效路径,不必担心找到它们。 什么是计算它们的有效方法?使用动态规划: dp[k, i, j] = number of paths from checkpoint k to (i, j) dp[k, i, j] =

给定一个大小为
nxn
的网格。它的左下角点是
(0,0)
,右上角元素是
(N-1,N-1)

我们可以沿顶部或右侧方向遍历网格。我们必须找到从左下角到右上角的遍历方式每条路径上都有一些检查点。至少有一个有效路径

示例:
N=5
(2,2)
有一个检查点,然后这里的答案是
36

注意:我只需要计算有效路径,不必担心找到它们。


什么是计算它们的有效方法?

使用动态规划:

dp[k, i, j] = number of paths from checkpoint k to (i, j)

dp[k, i, j] = dp[k, i - 1, j] +        top
              dp[k, i, j - 1]          right
答案是检查点之间的
dp
值的乘积


注意:你可以通过意识到矩阵中的实际位置并不重要,只是位置和检查点位置之间的相对距离来避免第一维度。

使用动态规划:

dp[k, i, j] = number of paths from checkpoint k to (i, j)

dp[k, i, j] = dp[k, i - 1, j] +        top
              dp[k, i, j - 1]          right
答案是检查点之间的
dp
值的乘积


注意:你可以通过意识到矩阵中的实际位置并不重要,只是位置和检查点位置之间的相对距离来避免第一维度。

你必须知道两件事:

  • :表示从起点到终点的路径数等于从起点到中点的路径数*从中点到终点的路径数

  • C(R,R+U)
    R
    是你的右移次数,
    U
    是上移次数,这意味着如果你想从
    (a,b)
    (C,d)
    然后
    R=C-a
    U=d-b
    ,以及
    C(R,R+U)=(R+U)!/R!U!
    )是网格中从左下到右上有多少种方式的答案

  • 示例在我的第二条规则中的示例中,我们有:

    (0,0)
    (2,2)
    的移动次数,因为从
    0
    向右移动两次后,您到达
    2
    ,从
    0
    向上移动两次后,您到达
    2
    所以
    R=2
    U=2
    所以
    C(2,2+2)=C(2,4)/2.2! = 6
    。对于
    R
    U
    (2,2)
    (4,4)
    的移动次数也是
    C(2,2+2)=C(2,4)=4/2.2! = 6


    根据第一条规则,我们有了所有可能的移动次数:
    6*6=36

    你必须知道两件事:

  • :表示从起点到终点的路径数等于从起点到中点的路径数*从中点到终点的路径数

  • C(R,R+U)
    R
    是你的右移次数,
    U
    是上移次数,这意味着如果你想从
    (a,b)
    (C,d)
    然后
    R=C-a
    U=d-b
    ,以及
    C(R,R+U)=(R+U)!/R!U!
    )是网格中从左下到右上有多少种方式的答案

  • 示例在我的第二条规则中的示例中,我们有:

    (0,0)
    (2,2)
    的移动次数,因为从
    0
    向右移动两次后,您到达
    2
    ,从
    0
    向上移动两次后,您到达
    2
    所以
    R=2
    U=2
    所以
    C(2,2+2)=C(2,4)/2.2! = 6
    。对于
    R
    U
    (2,2)
    (4,4)
    的移动次数也是
    C(2,2+2)=C(2,4)=4/2.2! = 6


    根据第一条规则,我们得到了所有可能移动的数量:
    6*6=36

    这个特殊问题的关键是找到子点之间的路径数量(根据它们各自的位置排序后),然后乘以所有路径的数量

    这里的解决办法是:

    1。从源到目标对点进行排序。

    例如: 如果起点为[0,0],终点为[10,10],中间点为[5,6]、[2,4]、[8,8],则在11X11矩阵中,排序点(包括源和目标)将为[0,0]、[2,4]、[5,6]、[8,8]、[10,10]

    2。查找从源到下一个子目的地的路径数(最好使用DP)。(按排序点的顺序)

    在上述示例中,需要计算的路径数将介于以下几点之间:

    [0,0]至[2,4]

    [2,4]至[5,6]

    [5,6]至[8,8]

    [8,8]至[10,10]

    3。找到上述4个子路径的乘积

    就这样


    下面是一个用于从源和目标查找路径数(参见DP方法)的示例。您不需要将矩阵作为参数传递,因为这是不需要的。只需要源点和目的点的[x,y][x,y]形式。除了链接中存在的代码外,还必须按照上述说明完成另一部分(对点进行排序和相乘)。

    这个特定问题的关键是找到子点之间的路径数(根据其各自的位置进行排序后),然后将所有路径数相乘

    这里的解决办法是:

    1。从源到目标对点进行排序。

    例如: 如果起点为[0,0],终点为[10,10],中间点为[5,6]、[2,4]、[8,8],则在11X11矩阵中,排序点(包括源和目标)将为[0,0]、[2,4]、[5,6]、[8,8]、[10,10]

    2。查找从源到下一个子目的地的路径数(最好使用DP)。(按排序点的顺序)

    在上述示例中,需要计算的路径数将介于以下几点之间:

    [0,0]至[2,4]<