题解:洛谷P1149 [NOIP2008 提高组] 火柴棒等式 加强版!!!
洛谷の原版,原题n<=24,暴力即可,本题n<=30000。
内存限制:128 MiB
时间限制:3000 ms
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:
img
注意:
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
- n根火柴棍必须全部用上
答案对 1000000007 取模输出
n <= 30000
思路
为了达成复杂度
- 考虑有没有进位
- 考虑A或者B是不是在这一位到达最高位(以免接下来的前导0耗费火柴,导致错误)
- 考虑A或者B是不是0,即目前是不是最低位(用bool值可以为dp数组省去一个30000的位,防止MLE)
即可写出数位dp的dfs框架:(是否为最低位,A结束,B结束,进位,剩余火柴)
1 | int dfs: bool zero, bool enda, bool endb, bool carry, int sum: |
非常的简单,直接代码
代码
1 | #include<bits/stdc++.h> |
样例
找不到其他可以测的地方,两个样例:
样例输入1
样例输出1
样例输入2
样例输出2
题解:洛谷P1149 [NOIP2008 提高组] 火柴棒等式 加强版!!!
https://imoliviauu.github.io/2024/08/26/solution-luogu-p1149-plus/
You need to set
install_url
to use ShareThis. Please set it in _config.yml
.