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

DeepSeek LeetCode 3971. 最大总价值 Rust实现

根据你提供的函数签名 pub fn count_balanced(low: i64, high: i64) -> i64,这道题是 LeetCode 3791. 给定范围内平衡整数的数目(而不是 3971)。

这是标准的数位 DP 解法:

```rust
impl Solution {
pub fn count_balanced(low: i64, high: i64) -> i64 {
fn count_upto(x: i64) -> i64 {
if x <= 0 {
return 0;
}

let digits: Vec<i32> = x
.to_string()
.bytes()
.map(|b| (b - b'0') as i32)
.collect();

let mut dp = BalancedDigitDp::new(digits);
dp.solve()
}
count_upto(high) - count_upto(low - 1)
}
}

struct BalancedDigitDp {
digits: Vec<i32>,
n: usize,
off: i32,
rest_len: usize,
memo: Vec<i64>,
}

impl BalancedDigitDp {
fn new(digits: Vec<i32>) -> Self {
let n = digits.len();
let off = (9 * n) as i32;
let rest_len = (2 * off + 1) as usize;
let memo_size = (n + 1) * rest_len * 2 * 2;
Self {
digits,
n,
off,
rest_len,
memo: vec![-1_i64; memo_size],
}
}

#[inline(always)]
fn index(&self, pos: usize, rest: i32, tight: usize, started: usize) -> usize {
let r = (rest + self.off) as usize;
(((pos * self.rest_len + r) * 2 + tight) * 2 + started)
}

fn solve(&mut self) -> i64 {
self.dp(0, 0, 1, 0)
}

fn dp(&mut self, pos: usize, rest: i32, tight: usize, started: usize) -> i64 {
if pos == self.n {
return if started == 1 && rest == 0 { 1 } else { 0 };
}

// 剪枝:剩余位数无法抵消当前差值
let remaining = (self.n - pos) as i32;
if rest.abs() > 9 * remaining {
return 0;
}

let mi = self.index(pos, rest, tight, started);
if self.memo[mi] != -1 {
return self.memo[mi];
}

let limit = if tight == 1 { self.digits[pos] } else { 9 };
let mut ans: i64 = 0;

// 情况1:当前位继续不填数字(前导零)
if started == 0 {
let next_tight = if tight == 1 && 0 == limit { 1 } else { 0 };
ans += self.dp(pos + 1, rest, next_tight, 0);
}

// 情况2:填数字
let start_d = if started == 1 { 0 } else { 1 };
// 奇数位(索引从0开始)加,偶数位减?题目要求奇数位和等于偶数位和
// 这里用 pos%2==1 时 rest + d,pos%2==0 时 rest - d
// 或者反过来,只要保证奇偶符号相反即可
let sign = if pos % 2 == 0 { 1 } else { -1 };

for d in start_d..=limit {
let next_tight = if tight == 1 && d == limit { 1 } else { 0 };
ans += self.dp(pos + 1, rest + sign * d, next_tight, 1);
}

self.memo[mi] = ans;
ans
}
}
```

核心思路

· 差分计数:用 count_upto(high) - count_upto(low - 1) 计算区间内满足条件的数字个数。
· 数位 DP:dp(pos, rest, tight, started) 表示从第 pos 位开始,当前奇数位数字和 - 偶数位数字和的差值为 rest,且受 tight(是否贴着上界)和 started(是否已开始填数字)约束时的合法数量。
· 前导零处理:started 标记用来跳过前导零,避免它们被计入位数和奇偶判断中。

注意事项

该题是 LeetCode 3791,不是 3971。3971 是“最大总价值”,两者解题思路完全不同。如果你需要的是 3971 的 Rust 解法,还请确认题目编号。

http://www.jsqmd.com/news/1297255/

相关文章:

  • 终极指南:如何在macOS上完美使用Xbox手柄的360Controller驱动
  • 2026 年现阶段,宛城值得关注的全铜变压器优质厂家深度剖析,换掉旧电器再也不用频繁烧钱,这玩意儿到底藏着什么好用的秘密?-光大变压器 - 行业鉴选官
  • 专治部署失败!OpenClaw2.7.9 Win11 权限 / 拦截 / 网关离线修复方案
  • 压缩完上下文后,Agent 怎么还记得你的开发习惯
  • 2026 年 7 月新发布:合浦靠谱的复合土工膜供应商深度解析,那些防渗工程里藏着的“隐形卫士”,为啥能让工期缩短三成还省三成成本? - 行业甄选官
  • 大模型+智能体:制造小白也能掌握的AI落地秘诀!收藏这份超全指南
  • 【计算机毕业设计单片机案例】基于传感器采集的柜体环境智能处理装置开发 基于 STM32 的柜门检测与环境除湿系统设计实现(013001)
  • 3分钟搞定:Windows读取Linux分区的终极免费解决方案Ext2Read
  • 建议收藏|AI论文工具2026最新测评与推荐
  • 2026 八一建军节大中型线上评选赛事策划 一键搭建投票活动方案 - 投票评选制作软件系统
  • MADDPG多智能体强化学习终极指南:从零开始掌握协作与竞争AI
  • 2026承德工伤维权实操指南 5位经验丰富律师实力推荐 - 本地品牌推荐
  • 2026年国内缺血预适应训练仪设备靠谱品牌排行 - 起跑123
  • LangGraph技术解析:构建复杂AI工作流的图计算框架
  • MATLAB六轴机械臂动力学建模:从拉格朗日法到仿真分析
  • 如何快速检测显示器VRR功能:VRRTest终极指南
  • 2026多语言多币种适配的B2B海外网站开发哪家好?
  • 【计算机毕业设计单片机案例】基于单片机的双模式垃圾桶阈值调节系统开发 基于 OLED 显示的智能垃圾桶状态监控装置设计(013101)
  • 2026年 组装线/流水线/立式工业烤箱/装配线/隧道炉厂家推荐榜:高精度制造与智能产线深度解析! - 优企名品
  • 2026年长春连锁餐厅装修优质餐饮门店公司推荐 - 起跑123
  • 如何轻松下载全网视频资源:3分钟掌握res-downloader代理工具
  • 2026年河南防火门哪家质量好 靠谱选购方向参考 - 起跑123
  • 2026年国内缺血预适应训练仪设备品牌选购排行指南 - 起跑123
  • KMP算法核心:最大公共前后缀长度与Next数组构建详解
  • 光纤光谱仪核心术语解析与工程实践指南
  • 计算机单片机毕设实战-基于 STM32 的药盒开盖检测与语音提醒系统 基于单片机的多时段定时吃药提醒装置设计(012901)
  • Cocos Creator 3.x小游戏手动分包实战:从45MB到合规包体的完整解决方案
  • 服务器CPU温度过高诊断与优化全攻略
  • 终极魔兽争霸III兼容性解决方案:5个专业技巧让经典游戏焕发新生
  • 2026年宁波企业工作服定制哪家好 相关测评分享 - 起跑123