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

Kimi LeetCode 3906. 统计网格路径中好整数的数目 Rust实现

以下是 LeetCode 3906 的 Rust 实现,采用数位 DP 思路,核心是将路径上访问的 7 个格子标记为关键位,然后对 `[0, x]` 范围内的数进行记忆化搜索。

```rust
impl Solution {
pub fn count_good_integers_on_path(l: i64, r: i64, directions: String) -> i64 {
// 标记路径上访问的 7 个关键格子(行优先顺序:pos = row * 4 + col)
let mut key = [false; 16];
let (mut row, mut col) = (0, 0);
key[0] = true; // 起点 (0,0)
for c in directions.chars() {
if c == 'D' {
row += 1;
} else {
col += 1;
}
key[row * 4 + col] = true;
}

// 数位 DP:计算 [0, x] 中满足条件的数的个数
let mut calc = |x: i64| -> i64 {
if x < 0 {
return 0;
}
// 将 x 补齐为 16 位字符串
let s = format!("{:016}", x);
let s_bytes = s.as_bytes();

// 记忆化数组 f[pos][last],-1 表示未计算
let mut f = [[-1i64; 10]; 16];

fn dfs(
pos: usize,
last: usize,
lim: bool,
key: &[bool; 16],
s_bytes: &[u8],
f: &mut [[i64; 10]; 16],
) -> i64 {
if pos == 16 {
return 1;
}
// 非受限状态且已计算过,直接返回
if !lim && f[pos][last] != -1 {
return f[pos][last];
}

let mut res = 0i64;
// 当前位的下界:如果是关键位,必须 >= last;否则可以从 0 开始
let start = if key[pos] { last } else { 0 };
// 当前位的上界:如果受限,则为 s[pos];否则为 9
let end = if lim {
(s_bytes[pos] - b'0') as usize
} else {
9
};

for i in start..=end {
let next_last = if key[pos] { i } else { last };
let next_lim = lim && (i == end);
res += dfs(pos + 1, next_last, next_lim, key, s_bytes, f);
}

// 只有非受限状态才缓存结果
if !lim {
f[pos][last] = res;
}
res
}

dfs(0, 0, true, &key, s_bytes, &mut f)
};

calc(r) - calc(l - 1)
}
}
```

关键思路说明

1. 路径预处理:`directions` 恰好包含 3 个 `'D'` 和 3 个 `'R'`,从 `(0,0)` 出发走 6 步到达 `(3,3)`。将路径上经过的 7 个格子在 16 位字符串中的位置(`row * 4 + col`)标记为 `key[pos] = true`。

2. 数位 DP:将数字补齐为 16 位后逐位枚举。对于每个位置 `pos`:
- 如果 `key[pos] == true`(路径上的格子),当前位必须 ≥ 上一个路径格子的值(`last`),同时更新 `last`。
- 如果 `key[pos] == false`(非路径上的格子),可以填任意数字 `0~9`,`last` 保持不变。

3. 受限状态 `lim`:表示当前位是否被上界 `s[pos]` 限制。如果受限,当前位最大只能填 `s[pos]`;否则可以填到 `9`。只有非受限状态的结果可以缓存。

4. 区间转换:通过 `calc(r) - calc(l - 1)` 得到 `[l, r]` 范围内的答案。

时间复杂度 O(16 \times 10 \times 10),空间复杂度 O(16 \times 10),完全在可接受范围内。

http://www.cnnetsun.cn/news/4024913.html

相关文章:

  • maxGraph零基础入门:纯客户端JavaScript图表库,零成本5分钟画出可交互流程图
  • Portainer:Docker可视化Web管理面板的新手首选方案
  • 华硕笔记本控制权争夺战:G-Helper一天上手,性能、散热与续航全面解放
  • Dism++完整上手指南:免费清理系统垃圾、修复更新失败的终极优化工具,5分钟就能见效
  • 【Proteus仿真设计】基于stm32单片机的智能家居系统设计
  • Dify 企业级实验(03):事件驱动流水线——Webhook 与定时触发如何组成异步处理链?
  • 一条命令给 Win11 系统优化瘦身,Win11Debloat 把预装软件和广告一次清干净
  • Windows APK安装器完全指南:免模拟器在电脑上安装安卓应用
  • SOLIDWORKS 正版软件价格全解析:商业版、教育版、科研版报价指南
  • 相机缓冲数据三种数据格式(数组、指针new、vector)
  • 贵州微信网站建设全流程解析:中小企业如何利用私域流量实现低成本高增长
  • 预算不够不用全套打包!生产自动化与 AI 管理支持分开采购、分步落地
  • 永嘉网站建设几年才见效?资深从业者揭秘低成本高效获客真相
  • 深入解析南海网站建设报价背后的逻辑与行业内幕揭秘
  • 揭秘城乡规划建设网站背后的真相:为什么它不仅是信息枢纽更是城市发展的灵魂指南
  • 范县网站建设企业为何需要专业的数字化升级之路?本地老板必看攻略
  • 南阳网站建设价格揭秘:为什么有人几百元有人几万元?
  • 南京百度网站建设多少钱?深度解析中小企业如何通过南京百度网站建设实现低成本高效率获客与品牌升级
  • 铝基板营销型网站建设:从流量焦虑到成交转化的终极指南 如何打造高转化的B2B官网
  • 选择滨州正规网站建设公司避坑指南:从需求到上线的全流程深度解析与实操建议
  • 第24篇 · 从零到一,我的AI学习之路——复盘与给后来者的建议
  • 宝安商城网站建设怎么避坑:从零基础到爆款店铺的实战指南与真心话
  • 054、LSC镜头阴影校正的“网格密度悖论“——为什么16x16网格比32x32更实用?从DDR带宽与边缘伪影角度深度剖析
  • 网站技术防护建设情况深度解析:企业数字化转型的核心底线与实战策略
  • 告别模板泛滥,深度解析定制化信息化建设网站范本的构建逻辑与核心价值
  • 揭秘2024年电子商务网站建设考试核心考点与实战通关指南
  • 深入解析电子商务网站前台建设:打造高转化率的线上 storefront 实战指南
  • 网站建设外包兼职:普通人如何靠技能月入过万的底层逻辑与避坑指南
  • BiliTools速通指南:这款开源B站视频下载工具,一次搞定视频、弹幕与无损音乐
  • 选择一家靠谱的西宁网站建设有限公司全攻略