C ++动态编程:遍历网格时出错

时间:2018-08-12 16:15:12

标签: algorithm dynamic-programming

这里是question 8中的2018 AIME Paper:青蛙位于坐标平面的原点。青蛙可以从点(x, y)跳到点(x + 1, y)(x + 2, y)(x, y + 1)(x, y + 2)中的任意一点。找到青蛙从(0, 0)开始到(x, y)结束的不同跳跃顺序数。

感觉可以使用动态编程来解决,但是我的代码似乎有一个我无法调试的错误。这是我解决问题的方法:

如果f[i][j]表示从(i, j)到达网格点(0, 0)的方式,则

f[i][j] = f[i - 1][j] + f[i - 2][j] + f[j - 1][i] + f[j - 2][i]

,我们必须为基本情况分配f[][]的值。

我认为逻辑上没有问题。但是输出是可怕的。 这是我的代码:https://ideone.com/lhhMUL

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, x, y;
    cin >> n >> x >> y;
    int f[n][n];
    f[0][1] = f[1][0] = 1;
    f[0][2] = f[2][0] = 2;
    f[1][2] = f[2][1] = 5;

    for (int i = 2; i <= x - 1; i++) {
        for (int j = 2; j <= y - 1; j++) {
            f[i][j] = f[i - 1][j]
                      + f[i - 2][j]
                      + f[j - 1][i]
                      + f[j - 2][i];
        }
    }
    cout << f[y][x];

    return 0;
}

1 个答案:

答案 0 :(得分:2)

我看到了两个错误

  1. j和i在您的递归方程中相反
  2. 从不计算f的初始值(例如f [3] [1])。它们只是分配数组时内存中的随机值。
#include <bits/stdc++.h>
using namespace std;

int main() 

{
    int n,x,y; cin>>n>>x>>y;
    int f[n][n];
    f[0][0]=1;
    f[1][0]=1;
    f[0][1]=1;
    f[1][1]=2;   

    for(int i = 2; i <= x; i ++ ) {
        f[i][0] = f[i-1][0] + f[i-2][0];
    }
    for(int i = 2; i <= x; i ++ ) {
        f[i][1] = f[i-1][1] + f[i-2][1] + f[i][0];
    }
    for(int j = 2; j <= y; j ++ ) {
        f[0][j] = f[0][j-1] + f[0][j-2];
    }
    for(int j = 2; j <= y; j ++ ) {
        f[1][j] = f[1][j-1] + f[1][j-2] + f[0][j];
    }

    for (int i=2; i<=x; i++)
        for (int j=2; j<=y; j++) {
            f[i][j]=f[i-1][j]+f[i-2][j]+f[i][j-1]+f[i][j-2];
            // cout << i << " " << j << " " << f[i][j] << endl;
        }

    cout<< f[x][y];

    return 0;
}