P8273 DP
Usada_Pekora · · 题解
看到数据范围再考虑到 USACO 从不卡常,可以猜想这应该是个
首先对输入串做一个处理:如果有乘
小学数学里有乘法交换律和加法交换律:
定义一种对
那么答案是不包含这类对
设
对于结尾为
对于结尾为
边界条件:
UPDATE :去了 memset 以后,跑的飞快,一发卡进最优解。
#include <bits/stdc++.h>
using namespace std;
const int N = 2005, mod = 1e9 + 7;
int n, f[N][N][2], lena, lenb, T;
char str[N], a[N], b[N];
inline void read(char s[], int &slen) {
slen = 0;
cin >> str;
int len = strlen(str);
for(int i = 0; i < len; i++) {
if(str[i] == '0') slen = 0;
else if(str[i] == '1') continue;
if(str[i] != '+') str[i] = '*';
s[++slen] = str[i];
}
}
inline int add(int a, int b) {
a += b;
return a >= mod ? a - mod : a;
}
signed main() {
ios::sync_with_stdio(false);
cin >> T;
while(T--) {
cin >> n;
read(a, lena), read(b, lenb);
f[0][0][1] = 1;
for(int i = 0; i <= lena; i++) {
for(int j = 0; j <= lenb; j++) {
if(i < lena) f[i + 1][j][0] = add(f[i][j][0], f[i][j][1]);
if(j < lenb) f[i][j + 1][1] = f[i][j][1];
if(i > 0 && j < lenb && a[i] != b[j + 1]) f[i][j + 1][1] = add(f[i][j + 1][1], f[i][j][0]);
}
}
printf("%d\n", add(f[lena][lenb][0], f[lena][lenb][1]));
}
return 0;
}