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

被折叠的 条评论
为什么被折叠?



