T1:Sequence Matching
本题难度中等,序列匹配问题,一般都可以考虑用类似公共子序列的DP方法。本题正是如此,考虑数组 的前缀和数组 的前缀匹配时, 的最小值,推出状态转移即可
记 dp[i][j]
表示将 与 中删掉 个后不同位置个数为 , 的最小值
最后的答案为
状态转移:
- 删 : 与 匹配
- 删 : 与 匹配
- 时都不删, 与 匹配
然后在后面续上 和
- 也都不删
初值:
- 其他
代码实现
#include <bits/stdc++.h> #define rep(i, n) for (int i = 0; i < (n); ++i) using std::cin; using std::cout; using std::vector; using std::min; const int INF = 1001001001; template<typename T> void chmin(T& a, const T& b) { a = min(a, b); } int main() { int n, m; cin >> n >> m; vector<int> a(n), b(m); rep(i, n) cin >> a[i]; rep(i, m) cin >> b[i]; vector<vector<int>> dp(n + 1, vector<int>(m + 1, INF)); dp[0][0] = 0; rep(i, n + 1)rep(j, m + 1) { if (i < n) chmin(dp[i + 1][j], dp[i][j] + 1); if (j < m) chmin(dp[i][j + 1], dp[i][j] + 1); if (i < n && j < m) { int co = 0; if (a[i] != b[j]) co = 1; chmin(dp[i + 1][j + 1], dp[i][j] + co); } } cout << dp[n][m] << '\n'; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现