给定一个 n×m 的方格阵,沿着方格的边线走,从左上角 (0,0)开始,每次只能往右或者往下走一个单位距离,问走到右下角 (n,m)一共有多少种不同的走法。
输入格式
共一行,包含两个整数 n 和 m。
输出格式
共一行,包含一个整数,表示走法数量。
数据范围
1≤n,m≤10
输入样例:
2 3
输出样例:
10
解法一 高中数学排列组合
从(0,0)到(n,m) 一共要走n+m步(只能向右或者向下的话)
从中挑出来n步向右剩下的向下即可 答案就是
这里要注意 int 会超范围 我自闭的一遍遍检查阶乘函数是否写错最后才发现原来是这个问题 见注释的这几行
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
long long f(int n)
{
long long res=1;
for(int i=1;i<=n;i++)
res*=i;
return res;
}
int main()
{
int n,m;
cin>>n>>m;
// cout<<"f(3)="<<f(3)<<endl;
// cout<<"f(4)="<<f(4)<<endl;
// cout<<"f(7)="<<f(7)<<endl;
cout<<f(n+m)/(f(n)*f(m));
return 0;
}
解法二 动态规划
(动态规划)O(nm)
f[i][j]表示走到点(i,j)的方案数,由于每次只能往下走或往右走,所以点(i,j)只能从点(i—1,j)或点(i,j一1)上走过来
所以走到点(i,j)的方案数是走到点(i―1,j)的方案数与走到点(i,j一1)的方案数之和,推出
f[i][j]=f[i-1][j]+f[i][j一1]
边界:f [i][0] = f[0][j]=1 当有一个等于0时走过来的方式就只有向右或者向下一种了
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int f(int x,int y)
{
if(x==0||y==0) return 1;
return f(x-1,y)+f(x,y-1);
}
int main()
{
int n,m;
cin>>n>>m;
cout<<f(n,m);
return 0;
}