DP经典问题——马过河卒

1.问题描述:

DP经典问题——马过河卒_第1张图片

2.算法分析:

DP经典问题——马过河卒_第2张图片

f[0][0] = 1;
for (int i = 0;i <= n; ++i) {
    for (int j = 0; j <= m; ++j) {
        if (i != 0) {
            f[i][j] = f[i][j] + f[i-1][j];
        }
        if (j != 0) {
            f[i][j] = f[i][j] + f[i][j-1];
        }
    }
}
// f[n][m]即为从(0,0)到(n,m)的路径数目

3.源代码:

#include 
using namespace std;
int dir[8][2] = {{1, 2}, {1, -2}, {2, 1}, {2, -1}, {-1, 2}, {-1, -2}, {-2, 1}, {-2, -1}};
bool d[30][30];
long long dp[30][30];

int main() {
    int n, m, cx, cy;
    // n, m 是棋盘大小,cx, cy 是马的位置
    cin >> n >> m >> cx >> cy;
    d[cx][cy] = true;
    for (int i = 0; i < 8; i++) {
        int tx = cx + dir[i][0];
        int ty = cy + dir[i][1];
        if (tx >= 0 && tx <= n && ty >= 0 && ty <= m) {
            d[tx][ty] = true;
        }
    }
    dp[0][0] = 1;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) {
            if (d[i][j] == false) {
                if (i) {
                    dp[i][j] += dp[i - 1][j];
                }
                if (j) {
                    dp[i][j] += dp[i][j - 1];
                }
            }
        }
    }
    cout << dp[n][m] << endl;
    return 0;
}

测评地址:
落谷:
https://www.luogu.org/problemnew/show/P1002
欢迎关注:
ly’s Blog

你可能感兴趣的:(DP,Oj,C++)