P1644 跳马问题(动态规划)

该博客探讨了一种经典的计算机科学问题——跳马问题,即在限制条件下计算中国象棋马在半张棋盘上的行走路径总数。博主提出了利用动态规划(DP)的方法来解决这一问题,通过建立DP公式简化了深搜的过程。代码实现中,博主展示了如何初始化状态并迭代计算每个位置的路径数量,最终输出总路径数。此题目的输入和输出样例也进行了展示,以验证算法的正确性。
摘要由CSDN通过智能技术生成

P1644 跳马问题

题目背景

在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧……

题目描述

中国象棋半张棋盘如图 1所示。马自左下角 (0,0)向右上角 (m,n) 跳。规定只能往右跳,不准往左跳。比如图 1 中所示为一种跳行路线,并将路径总数打印出来。

在这里插入图片描述

输入格式

只有一行:两个数 n,m。

输出格式

只有一个数:总方案数 total。

输入输出样例

输入 #1

4 8

输出 #1

37

说明/提示

对于 100% 的数据:n,m≤18

我的思路

此题乍一看就是深搜,不过小编认为dp法更简单。题目中说,马不能向左走,所以我们只需考虑四个方向的情况。

x[4] = {1, 2, 2, 1}, y[4] = {2, 1, -1, -2}

得出dp公式:
dp[i][j] = dp[i - 1][j - 2] + dp[i - 2][j - 1] + dp[i - 2][j + 1] + dp[i - 1][j + 2]

至于第一个for为什么从1开始,是因为从(0,0)出发, 因为马只能往右边走,所以i = 0时,没有任何情况经过,至少从i= 1开始。

AC代码

#include<bits/stdc++.h>
using namespace std;
int n, m, dp[21][21], x[4] = {1, 2, 2, 1}, y[4] = {2, 1, -1, -2};
int main() {
  cin >> n >> m;
  dp[0][0] = 1;
  for (int i = 1; i <= m; i++) 
    for (int j = 0; j <= n; j++) 
      for (int k = 0; k <= 3; k++) 
        if (i - x[k] >= 0 && j - y[k] >= 0)
          dp[i][j] += dp[i - x[k]][j - y[k]];
  cout << dp[m][n];
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值