当前位置: 首页 > article >正文

【多维 DP】力扣2400. 恰好移动 k 步到达某一位置的方法数目

给你两个 正 整数 startPos 和 endPos 。最初,你站在 无限 数轴上位置 startPos 处。在一步移动中,你可以向左或者向右移动一个位置。

给你一个正整数 k ,返回从 startPos 出发、恰好 移动 k 步并到达 endPos 的 不同 方法数目。由于答案可能会很大,返回对 109 + 7 取余 的结果。

如果所执行移动的顺序不完全相同,则认为两种方法不同。

注意:数轴包含负整数。

示例 1:
输入:startPos = 1, endPos = 2, k = 3
输出:3
解释:存在 3 种从 1 到 2 且恰好移动 3 步的方法:

  • 1 -> 2 -> 3 -> 2.
  • 1 -> 2 -> 1 -> 2.
  • 1 -> 0 -> 1 -> 2.
    可以证明不存在其他方法,所以返回 3 。

示例 2:
输入:startPos = 2, endPos = 5, k = 10
输出:0
解释:不存在从 2 到 5 且恰好移动 10 步的方法。

提示:
1 <= startPos, endPos, k <= 1000

动态规划

class Solution {
public:
    int numberOfWays(int startPos, int endPos, int k) {
        int MOD = 1e9+7;
        int offset = 1000;
        int maxRange = startPos + k;
        int minRange = startPos - k;
        vector<vector<int>> dp(3 * offset + 2, vector<int>(k+1));
        dp[startPos + offset][0] = 1;

        for(int j = 1; j <= k; j++){
            for(int i = minRange + offset; i <= maxRange + offset; i++){
                dp[i][j] = (dp[i-1][j-1] + dp[i+1][j-1]) % MOD;
            }
        }
        return dp[endPos + offset][k];
    }
};

这道题我们定义了一个偏移量offset,offset用于处理负轴上的数据,使他们在dp上的索引是正数。这道题我们需要注意的是如何定义dp的范围,由于startPos和k都在1000以内,那么负轴上最低的是startPos-k,因为startPos是正整数,所以负轴上最低是-999,正轴上最高是startPos+k,也就是2000,那么他们的范围就是3000,由于方便处理动态规划过程中的边界问题,令dp的行大小为3000+2。

我们定义一个二维数组dp[i][j],代表当前位置i和已经走了j步的情况下,有几种情况。那么我们可以知道dp[i][j]可以由dp[i-1][j-1]和dp[i+1][j-1]状态转移而来。

最后我们返回dp[endPos+offset][k],也就是在终点并且已经走了k步的情况下的情况有多少种。


http://www.kler.cn/a/441711.html

相关文章:

  • 方法建议ChatGPT提示词分享
  • linux下springboot项目nohup日志或tomcat日志切割处理方案
  • Linux(Centos 7.6)命令详解:dos2unix
  • golang接口
  • Java 的初认识(一)
  • 20250120 深入了解 Apache Flink 的 Checkpointing
  • 陕西科技大学《2024年807自动控制原理真题》 (完整版)
  • You need to call SQLitePCL.raw.SetProvider()
  • Java中的设计模式全解及电商应用场景示例
  • IP数据云查询IP归属地信息
  • 数据结构:Win32 API详解
  • CXF WebService SpringBoot 添加拦截器,处理响应报文格式
  • React里循环tab列表,并实现点击切换class
  • C语言学习day19:结构体/枚举/共用体/游戏结构体的逆向分析
  • Uniapp安卓端获取手机号码
  • Docker中 localhost 与 0.0.0.0 的区别详解
  • oracle client linux服务器安装教程
  • git SSL certificate problem: unable to get local issuer certificate
  • 只出现一次的数字(字节面试题 最优解)
  • OpenCV 功能函数介绍 (二)
  • awk使用详解
  • 【WPF】RenderTargetBitmap的使用
  • 如何让你的 PHP 应用坚不可摧
  • 【网络安全】掌握 Active Directory 攻防审计实操知识点
  • MaskGCT——开源文本转语音模型,可模仿任何人说话声音
  • 宝塔 搭建HOJ 配置域名 反向代理 开启https访问