NOI Online 2022 入门组 字符串 第三题题解
看着就很想用记忆化搜索是吧
设 表示决策到 的第 位, 中有 位无需删除,而且需要删除 的前 位和后 位。
那么我们分类讨论:
,那么 可以转移到 和 ,也就是可以删除首位或者末位。
那么 可以转移到 ,也就是说以后会被当做删除末位操作。
且 且 ,那么 可以转移到 ,也就是以后会被当做删除首位来操作。( 且 表示当前前面所有位置都被当做删除首位来处理)。
且 且 ,那么 可以转移到 ,也就是永远不删除该位。
但是这个四维显然 MLE 了(((
但是可以发现, !
于是压缩掉一维,AC辣!!!
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 405;
int n, m;
string s, t;
ll dp[N][N][N];
ll slove (int i, int j, int k, int l) {
if (i > n) {
return j == m && !k && !l;
}
if (~dp[i][j][k]) {
return dp[i][j][k];
}
ll res = 0;
if (s[i - 1] == '-') {
if (k) {
res = (res + slove (i + 1, j, k - 1, l)) % mod;
}
if (l) {
res = (res + slove (i + 1, j, k, l - 1)) % mod;
}
}
else {
res = slove (i + 1, j, k, l + 1) % mod;
if (!j && !l) {
res = (res + slove (i + 1, j, k + 1, l)) % mod;
}
if (s[i - 1] == t[j] && !l) {
res = (res + slove (i + 1, j + 1, k, l)) % mod;
}
}
return dp[i][j][k] = (res % mod);
}
int main () {
int T;
cin >> T;
while (T --) {
cin >> n >> m >> s >> t;
memset (dp, -1, sizeof (dp));
cout << slove (1, 0, 0, 0) % mod << endl;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫