题解
2026-08-31 17:15:44
发布于:浙江
17阅读
0回复
0点赞
首发题解,庆祝一下
大家好,我是энтджей,今天是我2026年第二十二次正式发题解!
能不能点个赞
首先简化题意:
- 简单来说捏就是给你一串东西,让你求可以拆分成 段的方案数,并且每一段的数字都不能超过 ,其中 可以代表任何数。
然后就是写代码:
- 这道题其实没有那么难想啊:
- 设
- 则 只能由 和 通过一定的规则得出, 即:
从 开始,防止 越界
- 上半部分比较好理解吧,我就大概讲一下下半部分:
- 当 时,说明可以组成两位数,则判断每个数字(10~26)是否可以被组成,组成方式必须满足:
- 满足则方案数+1,再算出上面的式子得出答案
- 当 时,说明可以组成两位数,则判断每个数字(10~26)是否可以被组成,组成方式必须满足:
最后输出:
- 输出最终的答案
完整代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
const int MOD = 1e9 + 7;
int n;
string s;
int dp[N];
// dp[i] 表示 前i个字符做多可以组成多少种解读方案
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
cin >> n;
cin >> s;
dp[0] = 1;
for (int i = 1; i <= n; i++) {
char c = s[i - 1];
dp[i] = 0;
// 组成一位数
if (c == '?') {
是'?'则 方案为上一次的方案数*这次可以变成的数字方案数
} else {
不是'?'则 方案为上一次的方案数
(0应该___)
}
// 组成两位数
if (可以组成两位数) {
int cnt = 0;
for (枚举十位) {
for (枚举个位) {
计算此次枚举的数是__
if (不可能组成) {
continue;
}
if (满足_____) {
cnt++;
}
}
}
dp[i] += dp[i - 2] * cnt;
}
取模
}
cout << dp[n];
return 0;
}
我感觉我都不需要贴代码你们应该能写
🎉完结撒花🎉
这里空空如也





有帮助,赞一个