牛客技能树:小红走矩阵(dp入门)

题目链接:https://www.nowcoder.com/practice/1ae49fb83b3f404f89dc0933bb8a0694?channelPut=tracker3

题目大意:小红位于一个 n×m矩阵的左上角,她每次只能向下或向右走一格。她想知道,要想到达矩阵的右下角,总共有多少种走法?由结果可能很大,请输出对 998244353998244353 取模后的值(1<=n,m<=1000)

题目思路:我们可以通过动态规划来解决这道题目,首先先定义状态dpij表示:从起点(1,1)走到(i,j)有多少种不同的走法;接着找到状态转移方程:要想到达(i,j),只有通过以下两种方式:向下走一格(i-1,j)->(i,j)和向右走一格(i,j-1)->(i,j),所以dpij=dpi-1j+dpij-1,也就是到达 (i,j) 的走法数 = 到达上面格子的走法数 + 到达左边格子的走法数;最后确定边界条件:

  • 起点 :dp[1][1] = 1(只有一种走法:原地不动)

  • 第一行 :dp[1][j] = 1(只能一直向右走,只有 1 种走法)

  • 第一列 :dp[i][1] = 1(只能一直向下走,只有 1 种走法)

实际上,只要 dp[1][1] = 1,其他格子按递推公式计算,边界也会自动正确(因为越界的格子值为 0)。

代码如下:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int mod = 998244353;
const int N = 1005;
int dp[N][N];//dp[i][j]表示:从起点(1,1)走到(i,j)有多少种不同的走法
void solve()
{
    int n, m;
    cin >> n >> m;
    dp[1][1] = 1;
    for (int i = 1; i < N;i++)
    {
        dp[1][i] = 1;
    }
    for (int i = 1; i < N; i++)
    {
        dp[i][1] = 1;
    }
    for (int i = 1; i <= n;i++){
        for (int j = 1; j <= m;j++){
            if((i==1&&j==1)||i==1||j==1)
                continue;
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1])%mod;
        }
    }
    cout << dp[n][m];
}    
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T=1 ;
    //cin>>T;
    while (T--)
    {
        solve();
    }
    return 0;
}
相关推荐
武子康27 分钟前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
zh_xuan2 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长2 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
早起CaiCai3 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码3 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法
猿人谷4 小时前
Surrogate Model:让进化算法学会“预测”,为什么它正在成为智能优化的重要技术?
后端·算法·架构
青少儿编程课堂5 小时前
蓝桥杯青少组图形化 STEMA 省考(报名倒计时·11/22开考)+ 全国青少年信息素养大赛 2026—2027赛季 + 电子学会图形化考级:校园华容道大闯关
c++·python·算法·bfs·信息学竞赛
在猴站学算法6 小时前
(《统计学习方法》(第2版) 李航)第2章 感知机算法
学习·算法·机器学习·统计学习
Rainmicro6 小时前
【无标题】
java·数据库·算法