NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

深度学习
• 阅读 16

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读

火柴棒等式问题(NOIP 2008洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式数量。题目核心在于将数字拆解与火柴棒消耗建模为数学问题,寻找高效解法。

二、解题思路

采用枚举 + 火柴棒计数策略:

  1. 映射关系构建:预计算0-9每个数字所需的火柴棒数量(如6根火柴构成“0”,2根构成“1”等),存储于match_count数组,降低重复计算开销。

  2. 双层循环枚举A、B:限定A、B范围(0-1111)以避免溢出,计算C = A + B。

  3. 总火柴棒计算:通过get_match_num函数累加A、B、C各自的火柴棒数,并额外计入“+”和“=”符号所需的4根火柴。

  4. 匹配统计:若总火柴棒数等于输入n,则计数加1。

三、解题步骤

  1. 初始化:定义输入n,计数器count,及火柴棒映射数组match_count。

  2. 双层循环遍历A、B:

    外层循环A(0-1111),内层循环B(0-1111),确保组合覆盖所有可能。

  3. 计算C及总火柴棒:

    通过C = A + B得到结果,调用get_match_num函数分别计算A、B、C的火柴棒数,并计入符号(+和=)的固定消耗。

  4. 条件判断:若总火柴棒数等于n,则count++。

  5. 输出结果:最终输出符合条件的等式数量。

四、代码与注释

#include <iostream>
using namespace std;

// 每个数字0-9所需的火柴棒数量
const int match_count[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

// 计算一个数字需要的火柴棒总数
int get_match_num(int num) {
    if (num == 0) return match_count[0];
    int total = 0;
    while (num > 0) {
        // 逐位累加火柴棒数(如123分解为1+2+3的火柴棒)
        total += match_count[num % 10];
        num /= 10;
    }
    return total;
}

int main() {
    int n;
    cin >> n;
    int count = 0;

    // 遍历所有可能的A和B组合
    for (int a = 0; a <= 1111; ++a) {
        for (int b = 0; b <= 1111; ++b) {
            int c = a + b;
            // 计算总火柴棒:A + B + C + '+' + '=' (符号需4根)
            int total = get_match_num(a) + get_match_num(b) + get_match_num(c) + 4;
            if (total == n) {
                count++;
            }
        }
    }

    cout << count << endl;
    return 0;
}

五、总结

该解法巧妙利用预计算与枚举结合,将火柴棒问题转化为数字拆解与累加。通过限定A、B范围避免无效计算,get_match_num函数优化了多位数字的火柴棒统计过程。尽管时间复杂度为O(n²),但通过空间换时间的策略(静态数组)显著提升效率。对于算法竞赛中的资源限制场景,此思路具有普适性,可作为类似问题的基准解法。

来源:NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

点赞
收藏
评论区
推荐文章
贾蔷 贾蔷
1个月前
2025年GESP七级等价消除(洛谷P11965)代码解析与优化策略
一、题目解读2025年GESP七级考试中的“等价消除(洛谷P11965)”问题要求统计给定字符串中满足等价条件的子串数量。所谓“等价子串”,是指子串中所有字符出现的次数均相同。题目需要高效算法解决,考验对字符串处理和状态压缩的掌握。二、解题思路采用位运算
贾蔷 贾蔷
2星期前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
贾蔷 贾蔷
2星期前
2023年GESP六级小杨握手问题(洛谷B3874):Fenwick树求解逆序对的代码解析
一、题目解读“小杨的握手问题”源自2023年GESP六级考试(对应洛谷题目B3874)。题目描述为:给定一个长度为N的排列,每次将当前数与之前未访问过的数握手,求总共握手次数。本质上是求排列中逆序对的个数,即统计每个数右侧比它小的元素数量。需设计高效算法在
贾蔷 贾蔷
2星期前
牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)
一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n1条边构成,保证为连通无环图。理解题目核心在于准确获取树的拓扑关系,并设计算法遍历
深度学习 深度学习
2星期前
2024蓝桥杯省赛B组前缀总分(洛谷P12124)解题思路与代码详解
一、题目解读2024年蓝桥杯省B组题目“前缀总分”(对应洛谷P12124)要求计算给定字符串集合中,所有前缀的最长公共前缀(LCP)的总分,并找出通过移动字符位置后可能获得的最大总分。题目考察字符串处理与动态规划能力,需高效计算LCP并优化得分策略。二、解
贾蔷 贾蔷
2星期前
2023年GESP六级题解:洛谷P10108闯关游戏动态规划解法详解
一、题目解读本文针对2023年GESP六级题目“闯关游戏”(洛谷P10108)进行详细解析。题目要求玩家通过不同关卡路径选择,计算从起点到终点的最大得分。关卡间存在跳跃规则,需结合动态规划思想设计高效算法,最终输出最优得分。二、解题思路采用动态规划(Dyn
深度学习 深度学习
2星期前
洛谷P2034题解:动态规划+单调队列优化求解最大K段子段和问题
一、题目解读洛谷P2034题目要求给定一个长度为n的整数数组,将其分成不超过k段,求各段和的最大值。该问题属于经典动态规划问题的扩展,需结合优化技巧高效求解。二、解题思路采用动态规划单调队列优化的策略。核心思想是定义状态dp
贾蔷 贾蔷
5天前
牛客3750题滑动窗口最大值解析:双端队列优化解法与代码详解
一、题目解读要求在一个给定的整数中,计算固定大小为k的内元素的最大值。例如,当窗口滑动时,需要实时输出每个窗口中的最大值序列。该问题考察对的理解,以及如何高效维护窗口内的元素关系。二、解题思路采用(deque)维护的巧妙解法。核心思想是:中仅存储数组下标,
贾蔷 贾蔷
11小时前
2024蓝桥杯省赛B组“传送阵”题解
一、题目解读2024年省B组“传送阵”题目要求处理一个包含n个节点的,节点间存在单向传输关系。每个节点i可传送至a中的最长路径问题,需考虑环的存在及节点间的连通性。二、解题思路1.预处理阶段使用标记法找出所有环,记录每个环的大小(即节点数)。2.统计最大环
贾蔷 贾蔷
11小时前
2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用
一、题目解读题目要求给定一个长度为N的S和M个待插入字符,通过将这些字符全部插入S中,构造出最小的新字符串。这是典型的字符串构造问题,考察选手对的理解和应用能力。二、解题思路采用贪心策略:1.先将待插入字符,便于按字典序选择2.遍历原字符串时,在保证字典序