题解:ABC292G Count Strictly Increasing Sequences
ABC292G Count Strictly Increasing Sequences
题目描述
你有
不过这 ?
位置上
请你求出,在所有可能的填数方案中,有多少种满足
思路
推导性质:
我们考虑一个合法的序列长什么样,它的每个数的最高位可能是这样的,
111...222...333...444......999
,
其中,最高位的数严格递增,即可保证序列严格递增,那如果最高位相等,就要求往后一位(去掉最高位后)严格递增。
状态设计:
设
举个例子:
转移:
我们枚举一个
转移即是:
含义就是,既然
然后
时间:
代码
const int N = 40 + 5, mod = 998244353;
int n, m;
string s[N];
int f[N][N][N], g[N][N][N]; // 滚动数组
void Solve(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> s[i];
s[i] = " " + s[i];
}
for(int i = 1; i <= n; i++) f[m + 1][i][i] = 1; // 边界
for(int i = m; i >= 1; i--){
for(int j = 0; j <= 9; j++){
memcpy(g[i], f[i], sizeof(f[i]));
for(int len = 1; len <= n; len++){
for(int l = 1; l + len - 1 <= n; l++){
int r = l + len - 1;
bool flag = true;
for(int k = r; k >= l; k--){
if(s[k][i] == '?' || s[k][i] == j + '0'){
if(k == l) break;
f[i][l][r] = (1ll * f[i][l][r] + 1ll * g[i][l][k - 1] * f[i + 1][k][r] % mod) % mod;
}else{
flag = false;
break;
}
} // 最后需要特判整个区间都相等
if(flag) f[i][l][r] = (1ll * f[i][l][r] + f[i + 1][l][r]) % mod;
}
}
}
}
cout << f[1][1][n] << endl;
}
本文作者:chenwenmo
本文链接:https://www.cnblogs.com/chenwenmo/articles/18458878
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步