以最大可能的重量遍历网格,并且不应重复任何路径

时间:2019-01-08 10:40:57

标签: matrix path dynamic-programming traversal

给定一个NxN网格,每个像元都有一定的权重,并且网格中有2M个像元被标记,因此我们需要以这种方式遍历(从标记的像元开始并在标记的像元处结束)网格所有路径都必须是唯一的(也包括起点和终点),而且所有路径中所有像元的权重之和应尽可能大。

输入:-

假设N = 4,M = 2

(1 1), (2 2), (3 3), (4 4){在网格中标记为单元格}

1 -1 -1 -1

1 1 1 1

1 1 1 1

-1 -1 -1 1   {带权重的网格}

输出:-

首先,我们需要输出访问过的单元格数量,然后输出路径

5 1 1 2 1 3 1 3 2 3 3 {已访问5个单元,(1,1)开始和(3,3)结束}

5 4 4 3 4 2 4 2 3 2 2 {与上一个相似}

所以我们访问了所有标记的单元格,并且总重量(第一条路径+第二条路径的权重之和)是最大可能的。

我的想法-:

我意识到(如果有错,请纠正我)这是一些网格+ DP问题的组合

(1)。在最大重量的网格中找到路径。

(2)。从给定单元开始到达给定单元。

现在上面两个是标准的DP +网格问题,我分别解决了每个问题

#include <bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i = (int)(a); i <= (int)(b); i++)
#define RF(i,a,b) for(int i = (int)(a); i >= (int)(b); i--)
int main()
{
    int X,Y; //X:number of rows, Y: number of columns
    X = Y = 10; //assuming 10X10 matrix
    int Cost[X][Y];

    F(i,0,X-1)
    {
        F(j,0,Y-1)
        {
            //Take input the cost of visiting cell (i,j)
            cin>>Cost[i][j];
        }
    }

    int MinCost[X][Y]; //declare the minCost matrix

    MinCost[0][0] = Cost[0][0];

    // initialize first row of MinCost matrix
    F(j,1,Y-1)
        MinCost[0][j] = MinCost[0][j-1] + Cost[0][j];

    //Initialize first column of MinCost Matrix
    F(i,1,X-1)
        MinCost[i][0] = MinCost[i-1][0] + Cost[i][0];

    //This bottom-up approach ensures that all the sub-problems needed
    // have already been calculated.
    F(i,1,X-1)

类似地,我解决了路径查找器,但是后来我意识到这是2个源问题,我们可以从2个指定的单元格开始(1个开始的标记单元格和1个结束的标记单元格),但是我需要提供它们必须满足的中间单元格

那么您能提供一些提示或伪代码如何合并所有这些问题吗?

0 个答案:

没有答案