带记忆的动态编程

时间:2017-06-16 10:02:59

标签: algorithm dynamic-programming memoization

因为我是动态编程的新手。有人可以帮助我实现算法的记忆技术以解决以下问题。

有一个N行和M列的2D矩阵。行从上到下依次为0到N-1,从左到右依次为0到M-1。你站在(0,0)。

From,A [i] [j]如果A [i + 1] [j]>你可以移动到A [i + 1] [j] A [i] [j]。或者,从A [i] [j]开始,如果A [i] [j + 1]>,则可以移动到A [i] [j + 1]。 A [i] [j]。

从(0,0)移动,你可以旅行的最长路径是什么?

static int a[][],n,m;
static int find(int x,int y)
{
    if((x==n-1 && y==m-1))
    {
        return 1;
    }
    else if(x<n-1 && y<m-1 && a[x+1][y]>a[x][y] && a[x][y+1]>a[x][y])
    {
        return Math.max(find(x+1,y),find(x,y+1))+1;
    }
    else if(x<n-1 && a[x+1][y]>a[x][y])
    {
        return find(x+1,y)+1;
    }
    else if(y<m-1 && a[x][y+1]>a[x][y])
    {
        return find(x,y+1)+1;
    }
    return 1;
} 

其中.. x和y是初始位置(即(0,0)), n和m是resply的行和列, a是实际的矩阵。

1 个答案:

答案 0 :(得分:0)

您希望使用memoization来存储find()的结果,以便在已经计算出来时可以重复使用它们:

  1. n函数
  2. 之外的m数组(称之为memo)声明另一个find()
  3. find()返回之前,将计算结果存储在memo[x][y]
  4. 在find()的开头,检查memo[x][y]是否已填写(非零)并返回