走方格的方案数

走方格的方案数

/*
2022年09月21日 11:43:09
注意是沿着边缘线走,而不是在格子里走
并且只能往右或者往下走
n=1 m=1 右下、下右两种  --》n+m
n=1 m    1+m种  --》n+m
m=1 n    1+n种  --》n+m
m n大于1时,走到最后个格子右下角有2条路
右下、下右
递归实现即可
时间复杂度:OO(2^n),其中n=max(m,n),递归是一个树型递归
空间复杂度:O(n),递归栈最大深度为树的深度nnn
*/

#include <iostream>
using namespace std;

int pathNum(int r, int c) {
    if (r == 0 || c == 0) // 不会有这种,至少得有一个格子才能走的
        return 0;
    if (r == 1 && c >= 1 || r >= 1 && c == 1)
        return r + c;
    return pathNum(r - 1, c) + pathNum(r, c - 1);
}

int main() {
    int row, col;
    cin >> row >> col;
    cout << pathNum(row, col) << endl;
}
/*
2022年09月21日 11:43:09
动态规划

用dp[i][j]表示到第i行第j列的方案数,
= 左边的方案数+上边的方案数
r=0 || c=0 其实就是一条横线或者竖线,只有一种方案

*/

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int r, c;
    cin >> r >> c;
    vector<vector<int>> dp(r+1, vector<int>(c+1, 0));
    for(int i = 0; i <= r; ++i){
        for(int j = 0; j <= c; ++j){
            if(i == 0 || j == 0) // 一条直线
                dp[i][j] = 1;
            else
                dp[i][j] = dp[i][j-1] + dp[i-1][j];
        }
    }
    cout << dp[r][c] << endl;
}