Description
给定
n
和
Solution
考虑模型DP。
设
fi,j
表示到
i
行
设
这是一个网格上的DP,那么就只与其轮廓线上的DP值有关。
每一位都是
复杂度是
O(nm22m)
的吧。。
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000009;
class StringPath {
public:
string A, B;
int n, m, U, ans, cur;
int dp[10][10][1 << 8][1 << 8];
inline void Add(int &x, int a) {
x += a; while (x >= MOD) x -= MOD;
}
inline int countBoards(int n, int m, string A, string B) {
U = (1 << m) - 1;
ans = 0;
if (A[0] == B[0]) {
dp[0][0][1][1] = 1;
dp[0][0][0][0] = 25;
} else return 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++) {
if (i == n - 1 && j == m - 1) continue;
for (int s = 0; s <= U; s++)
for (int t = 0; t <= U; t++)
if (cur = dp[i][j][s][t]) {
int x = i, y = j + 1;
if (y == m) {
y = 0; ++x;
}
int ns = s | (s << 1 & 1 << y),
nt = t | (t << 1 & 1 << y);
int fs = ns & (U ^ (1 << y)),
ft = nt & (U ^ (1 << y));
if (A[x + y] == B[x + y]) {
Add(dp[x][y][ns][nt], cur);
Add(dp[x][y][fs][ft], 25ll * cur % MOD);
} else {
Add(dp[x][y][ns][ft], cur);
Add(dp[x][y][fs][nt], cur);
Add(dp[x][y][fs][ft], 24ll * cur % MOD);
}
}
}
for (int i = 0; i <= U; i++)
for (int j = 0; j <= U; j++)
if (((i >> m - 1) & 1) && ((j >> m - 1) & 1))
Add(ans, dp[n - 1][m - 1][i][j]);
return ans;
}
};
StringPath T;
int n, m;
string x, y;
int main(void) {
freopen("1.in", "r", stdin);
cin >> n >> m >> x >> y;
cout << T.countBoards(n, m, x, y) << endl;
return 0;
}