Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
26845 | gaochunzhen | 【BJ】T2 | C++ | 通过 | 100 | 187 MS | 188632 KB | 1496 | 2024-02-26 16:58:02 |
#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 4009; int n, m, K, a[N], b[N], dp[N][N], nxt[2][N][N], ans = 2e9; int main() { scanf("%d%d%d", &n, &m, &K); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= m; i++) scanf("%d", &b[i]); memset(nxt, 0x3f, sizeof(nxt)); for (int i = n - 1; i >= 0; i--) { for (int j = 1; j <= K; j++) { if (a[i + 1] == j) nxt[0][i][j] = i + 1; else nxt[0][i][j] = nxt[0][i + 1][j]; } } for (int i = m - 1; i >= 0; i--) { for (int j = 1; j <= K; j++) { if (b[i + 1] == j) nxt[1][i][j] = i + 1; else nxt[1][i][j] = nxt[1][i + 1][j]; } } memset(dp, 0x3f, sizeof(dp)); dp[0][0] = 0; for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { if (a[i] == b[j]) { int fl = 0; for (int k = 1; k <= K; k++) { int nx = nxt[0][i][k], ny = nxt[1][j][k]; if (nx <= n && ny <= m) dp[nx][ny] = min(dp[nx][ny], dp[i][j] + 1); if (nx <= n) dp[nx][j] = min(dp[nx][j], dp[i][j] + 1); if (ny <= m) dp[i][ny] = min(dp[i][ny], dp[i][j] + 1); if (nx > n && ny > m) fl = 1; } if (fl) ans = min(ans, dp[i][j]); } } } printf("%d\n", ans + 1); return 0; }