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

DeepSeek LeetCode 3971. 最大总价值 C语言实现

根据您提供的函数签名,这对应的是LeetCode 3791「给定范围内平衡整数的数目」,而非 3971。平衡整数定义为奇数位数字之和等于偶数位数字之和。

核心解法是数位 DP,用前缀和思想将区间 [low, high] 转化为 count(high) - count(low - 1)。

下面是 C 语言实现:

```c
#include <string.h>
#include <stdlib.h>

// 记忆化数组:dp[pos][diff][tight][started]
// 由于 diff 范围 [-9*18, 9*18],加上偏移量 OFFSET 转为非负索引
#define MAX_POS 20
#define MAX_DIFF 200
long long memo[MAX_POS][MAX_DIFF][2][2];

char digits[MAX_POS];
int len;

long long dfs(int pos, int diff, int tight, int started) {
if (pos == len) {
return (started && diff == 0) ? 1 : 0; // 必须已经开始且差值为0[reference:4]
}

if (memo[pos][diff + 100][tight][started] != -1) {
return memo[pos][diff + 100][tight][started];
}

long long res = 0;
int limit = tight ? (digits[pos] - '0') : 9;

// 情况1:还没开始,跳过当前位(前导零)
if (!started) {
res += dfs(pos + 1, diff, 0, 0); // tight 变为 false[reference:5]
}

// 情况2:枚举当前位可填数字
int start_digit = started ? 0 : 1; // 未开始则不能填0[reference:6]
for (int d = start_digit; d <= limit; d++) {
int new_diff = diff + ((pos % 2 == 0) ? d : -d); // 奇数位加,偶数位减[reference:7]
int next_tight = tight && (d == limit);
res += dfs(pos + 1, new_diff, next_tight, 1);
}

memo[pos][diff + 100][tight][started] = res;
return res;
}

long long count_upto(long long n) {
if (n < 10) return 0; // 平衡数至少需要两位数[reference:8]

sprintf(digits, "%lld", n);
len = strlen(digits);

// 初始化记忆化数组
for (int i = 0; i < MAX_POS; i++) {
for (int j = 0; j < MAX_DIFF; j++) {
for (int t = 0; t < 2; t++) {
for (int s = 0; s < 2; s++) {
memo[i][j][t][s] = -1;
}
}
}
}

return dfs(0, 0, 1, 0); // 从最高位开始,初始受限,未开始[reference:9]
}

long long countBalanced(long long low, long long high) {
return count_upto(high) - count_upto(low - 1); // 前缀和相减[reference:10]
}
```

核心逻辑说明

· 数位 DP 状态:dfs(pos, diff, tight, started) 表示处理到第 pos 位,当前奇数位和减偶数位和为 diff,tight 表示是否贴着上界,started 表示是否已开始填数字。
· 前导零处理:started=0 时可以选择跳过当前位,或者从 1 开始填数字,避免将前导零误判为偶数位。
· 奇偶判断:pos%2==0 视为奇数位(从0开始索引),加 d;否则为偶数位,减 d。
· 区间转换:用 count_upto(high) - count_upto(low-1) 计算 [low, high] 内的平衡数个数。

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

相关文章:

  • GetQzonehistory:如何用3分钟永久备份你的QQ空间记忆?
  • C++网络流量分析工具开发:从libpcap到协议解析与性能优化
  • 【计算机毕业设计单片机案例】基于红外检测的定时服药智能控制系统实现 基于 STM32 的多组定时任务药盒提醒装置(012901)
  • Oracle 字符集 简体中文 转换 UTF8
  • 制造业:2026年农药与鸡精生产线优质厂家评估:山河干燥在wdg一体化与全自动配料领域的产业价值分析 - 优企名品
  • 电容工作原理与应用场景全解析
  • Java应用性能优化实战:JVM核心参数解析与内存问题排查指南
  • 如何在2026年快速掌握大麦自动抢票神器:双端智能购票完全指南
  • 2026年自考论文AI辅助工具实战指南
  • 2026 年至今,沙河口优秀的下水道疏通施工队推荐,你家卫生间堵到淹脚,这招能省好几百疏通费?-嘉宝管道疏通 - 企业信息推荐【官方】
  • 2026承德劳动争议维权全攻略 法财税视角的5位律师推荐 - 本地品牌推荐
  • GPT-5.6多智能体协作与工具调用实战指南
  • DeepSeek LeetCode 3971. 最大总价值 Rust实现
  • 终极指南:如何在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海外网站开发哪家好?