当前位置:首页 > 提高组 > NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

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

3天前

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

一、题目解读

火柴棒等式问题(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²),但通过空间换时间的策略(静态数组)显著提升效率。对于算法竞赛中的资源限制场景,此思路具有普适性,可作为类似问题的基准解法。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣198.打家劫舍|动态规划解法中的特殊边界处理

力扣198.打家劫舍|动态规划解法中的特殊边界处理

题意解析:在排列成直线的房屋群中,每个房屋藏有价值不同的财物。小偷不能连续抢劫相邻的两间房屋,否则会触发警报。我们需要设计一套抢劫策略,使得在不触发警报的前提下,能够获取的最大财物总和。这个问题本质上...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

【动态规划入门】力扣509题:斐波那契数列的经典解法与优化思路

题目解读‌斐波那契数列是一个经典的数学问题,在计算机科学中常被用作算法教学的入门案例。这个神奇的数列从0和1开始,后续每个数字都是前两个数字之和。题目要求我们计算第n个斐波那契数,看似简单的问题背后却...

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

2024年GESP五级武器强化(洛谷B4071)解题代码C++版

一、题目解读    2024年GESP(青少年软件编程能力等级考试)五级中的“武器强化”(洛谷平台题目编号B4071)是一道典型的算法优化问题。题目要求通过合理...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

一、题目解读题目要求在一个n×m的网格中,从左上角到右下角选择一条路径,路径上的数字可重复取用,求取数之和的最大值。路径限制为仅能向右或向下移动。需注意路径的灵活性与重复取数的可能性,传统单向动态规划...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。