华为算法刷题 90 走方格的方案数

本文介绍了如何使用动态规划方法计算从棋盘左上角到右下角,仅沿边缘线且不回头的走法数量。通过给定的示例和代码,展示了如何通过dp[n][m]=dp[n-1][m]+dp[n][m-1]的递推关系求解n*m棋盘的走法总数。
摘要由CSDN通过智能技术生成

描述

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

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

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

输入描述:

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

输出描述:

输出一行结果

示例1

输入:2 2

输出:6


思路为:

一个格子时,从格子的左上角抵达右下角,可以有两条路线,

当有一行两列共两个格子时,可以从前面一个格子右下角过来,也可以有新路线,从前一个格子右上角过来。共2+1=3条

有两行一列共两个格子时,可以从上面格子右下角过来,也可以走新路线,从前面格子左下角过来。共2+1=3条

当有2行2列格子时,可以从(1,2)格子右下角过来,也可以从(2,1)格子右下角过来,共3+3=6条。

可以发现dp[n][m]=dp[n-1][m]+dp[n][m-1],而且当n=0或者m=0时,dp[n][m]=1;


#include <stdio.h>

int main() {
    int n,m;
    scanf("%d %d",&n,&m);
    int dp[n+1][m+1];
    int i,j;
    for(i=0;i<n+1;i++)
    {
        dp[i][0]=1;
    }
    for(j=0;j<m+1;j++)
    {
        dp[0][j]=1;
    }
    for(i=1;i<n+1;i++)
    {
        for(j=1;j<m+1;j++)
        {
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
    }
    printf("%d",dp[n][m]);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值