- P36's solution
P36's Solution
- 2025-9-4 21:59:22 @
设 为走了 步最终到达 的合法方案数,直接 DP 并根据走步轨迹转移即可。
#include <bits/stdc++.h>
using namespace std;
int ok[4][2012][2012];
char f[4][2012], g[2012];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= n; j++)
cin >> f[i][j];
for (int i = 1; i <= m; i++)
cin >> g[i];
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= n; j++)
if (f[i][j] == g[m]) ok[i][j][m] = 1;
for (int k = m - 1; k >= 1; k--)
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= n; j++)
{
if (f[i][j] != g[k]) continue;
ok[i][j][k] += ok[i - 1][j][k + 1];
ok[i][j][k] += ok[i + 1][j][k + 1];
ok[i][j][k] += ok[i][j - 1][k + 1];
ok[i][j][k] += ok[i][j + 1][k + 1];
ok[i][j][k] %= 1007;
}
int ans = 0;
for (int i = 1; i <= 2; i++)
for (int j = 1; j <= n; j++)
ans += ok[i][j][1];
cout << ans % 1007 << endl;
return 0;
}