2020年第十一届蓝桥杯省赛第一场C/C++B组题解 试题 H: 走方格

一、问题描述

  在平面上有一些二维的点阵。
  这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
  现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。
  注意,如果行号和列数都是偶数,不能走入这一格中。
  问有多少种方案。

输入格式: 输入一行包含两个整数 n, m
输出格式: 输出一个整数,表示答案。

样例1输入: 3 4
样例1输出: 2

样例2输入: 6 6
样例2输出: 0

评测用例规模与约定:
  对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30

二、问题分析

  看到题目应该能想到用动态规划,每一次的状态跟前面的状态都有关系。

  • 确定dp数组以及下标的含义: d p [ i ] [ j ] dp[i][j] dp[i][j]:表示从 ( 1 , 1 ) (1,1) (11)出发,到达 ( i , j ) (i,j) (ij) d p [ i ] [ j ] dp[i][j] dp[i][j]不同方案。
  • 确定递推公式:格子 ( i , j ) (i,j) (ij)可以 ( i − 1 , j ) (i-1,j) (i1j)向下到达,也可以从 ( i , j − 1 ) (i,j-1) (ij1)向右到达,所以递推公式: d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j]=dp[i-1][j]+dp[i][j-1] dp[i][j]=dp[i1][j]+dp[i][j1]。不过要注意,当 i i i j j j 为偶数时, d p [ i ] [ j ] dp[i][j] dp[i][j]则应该保持初始状态(初始状态为0)。
  • 初始化dp数组:从 ( 1 , 1 ) (1,1) (11) ( i , 1 ) (i,1) (i1)的方案只有一种,所以 d p [ i ] [ 1 ] dp[i][1] dp[i][1]一定都是1, d p [ 1 ] [ j ] dp[1][j] dp[1][j]同理。

三、代码实现

// 编程软件:Dev-C++ 5.4.0 
#include<iostream>
#include<vector>
using namespace std;

int main() {
	int n, m;
	cin >> n >> m;

	vector<vector<int> > dp(n + 1, vector<int>(m + 1, 0));
	for (int i = 1; i <= n; i++) dp[i][1] = 1; // 初始化
	for (int j = 1; j <= m; j++) dp[1][j] = 1; // 初始化

	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= m; j++) {
			if ((i % 2 == 0) && (j % 2 == 0)) continue; // 行号和列数都是偶数,直接返回循环 
			dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // 递推公式
		}
	}
	cout << dp[n][m];
	return 0;
}

四、小结

  与本题类似的题目:力扣:63. 不同路径 II

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeKwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值