基础动态规划 - 过河卒

过河卒

兵从A点走到B点的所有路径方案,且不能经过 “马能吃棋子”的格子。

如果没有马,那么这道题就是一个简单的从A点走到B点的所有路径情况的简单动态规划。

状态转移方程为 dp[i,j] = dp[i - 1,j] + dp[i,j - 1]。

但如果加上了马这个棋子,就需要做出一些额外的判断了,要保证,在判断马所能跳的位置的时候,是不能越界的。

但是 f 的初始数值都是 0,再怎么推也都是 0,要让后面的式子能根据前面的推出来结果,只需要让 dp[1,0] = 1即可。

class Solution {
  public:
    typedef long long ll;
    int crossRiver(int n, int m, int x, int y) {
        // 防止越界
        n += 2;
        m += 2;
        x += 2;
        y += 2;
        // dp数组
        ll dp[40][40] = {0};
        // 马能跳的位置的数组
        int st[40][40] = {0};
        // 马能跳的位置
        int dy[9] = {0, 1, 2, 2, 1, -1, -2, -2, -1};
        int dx[9] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
        // dp数组边界初始化
        dp[2][1] = 1;
        // 对马能走的地方进行一个初始化
        for (int i= 0; i < 9; i++) st[x + dx[i]][y + dy[i]] = 1;
        // 开始dp
        for (int i= 2; i <= n; i++){
            for(int j = 2; j <= m; j++){
                // 当这个位置马能吃掉棋子的时候
                if (st[i][j]) continue;
                // 不能吃掉
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[n][m];

    }
};
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值