华为机试题91-走方格的方案数

本文介绍了如何使用动态规划解决棋盘行走问题,即在n*m的棋盘上从左上角走到右下角,只能往右和往下走。通过建立二维数组dp,利用状态转移方程dp[i][j]=dp[i][j-1]+dp[i-1][j]计算所有可能的走法。示例代码展示了C语言的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。

注:沿棋盘格之间的边缘线行走

数据范围: 1≤n,m≤8

输入描述:

输入两个正整数n和m,用空格隔开。(1≤n,m≤8)

输出描述:

输出一行结果

示例1

输入:

2 2

输出:

6


解题思路:

这题算是比较经典的动态规划题了,难度也没有其他动态规划题大,适合入门。

注意:题目要求只能往右或往下走,不能反向

我们用动态规划来解题,能比递归少很多重复计算;

设从起点(0,0)到达终点(n,m)总共有dp[n][m]种走法;

如果要到达的终点是(0,j),且j≥1,显然我们只有一种走法,那就是一直往右走,此时dp[0][j]=1;

若要到达的终点是(i,0),且i≥1,此时也只有一种走法,那就是一直往下走,此时dp[i][0]=1;

如果要到达的终点是(i,j),且i>1,j>1,此时有多少种走法?

我们可以这么想,如果要到达(i,j),那上一步在的位置只能是(i-1,j)或者(i,j-1),或者说只能从正上方往下走一格,或者正左方往右走一格才能到终点。那走到终点[i][j]的走法dp[i][j]就等于走到[i-1][j]的走法dp[i-1][j]加上走到[i][j-1]的走法dp[i][j-1]。即dp[i][j]=dp[i-1][j]+dp[i][j-1]。

以下为代码实现:

#include <stdio.h>
#define    N    100
int main()
{
    int dp[N][N],i,j,n,m;
    scanf("%d%d",&n,&m);
    for(i=0;i<=n;i++)
    {
        for(j=0;j<=m;j++)
        {
            if(i==0||j==0)
                dp[i][j]=1;
            else
                dp[i][j]=dp[i][j-1]+dp[i-1][j];
        }
    }
    printf("%d\n",dp[n][m]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值