首发题解,庆祝一下
大家好,我是ЭНТДЖЕЙ,今天是我2026年第二十二次正式发题解!
2026年发布的题解!
能不能点个赞
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
首先简化题意:
* 简单来说捏就是给你一串东西,让你求可以拆分成 xxx 段的方案数,并且每一段的数字都不能超过 262626,其中 ??? 可以代表任何数。
然后就是写代码:
* 这道题其实没有那么难想啊:
* 设 dp[i]表示前i个字符做多可以组成多少种解读方案dp[i]表示前i个字符做多可以组成多少种解读方案dp[i]表示前i个字符做多可以组成多少种解读方案
* 则 dp[i]dp[i]dp[i] 只能由 dp[i−1]dp[i - 1]dp[i−1] 和 dp[i−2]dp[i - 2]dp[i−2] 通过一定的规则得出, 即:
dp[i]={dp[i−1],s[i−1]!=′?′&&s[i−1]!=′0′dp[i−1]∗9,s[i−1]==′?′dp[i]+=dp[i−2]∗(s[i−2]和s[i−1]最多组成的数字方案数),(i>=2)dp[i] = \begin{cases} dp[i - 1], s[i - 1] != '?' \&\& s[i - 1] != '0' \\ dp[i - 1] * 9, s[i - 1] == '?' \\ \end{cases} \\ dp[i] += dp[i - 2] * (s[i - 2] 和 s[i - 1] 最多组成的数字方案数), (i >= 2)
dp[i]={dp[i−1],s[i−1]!=′?′&&s[i−1]!=′0′dp[i−1]∗9,s[i−1]==′?′ dp[i]+=dp[i−2]∗(s[i−2]和s[i−1]最多组成的数字方案数),(i>=2)
III 从 111 开始,防止 I−1I - 1I−1 越界
* 上半部分比较好理解吧,我就大概讲一下下半部分:
* 当 i>=2i >= 2i>=2 时,说明可以组成两位数,则判断每个数字(10~26)是否可以被组成,组成方式必须满足:
s[i−2]==′?′∣∣s[i−2]==十位&&s[i−1]==′?′∣∣s[i−1==个位s[i - 2] == '?' || s[i - 2] == 十位 \\ \&\& \\ s[i - 1] == '?' || s[i - 1 == 个位 s[i−2]==′?′∣∣s[i−2]==十位&&s[i−1]==′?′∣∣s[i−1==个位
* 满足则方案数+1,再算出上面的式子得出答案
最后输出:
* 输出最终的答案
完整代码:
我感觉我都不需要贴代码你们应该能写
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
🎉完结撒花🎉