题意:给你两个字符串,问你这两个能否匹配,第二个字符串中两种含有特殊字符。。(规则看题)。
题解:dp[m][n]:表示第二个串的前m个字符和第一个串的前n个字符能否匹配。。。
算是第一次在多校比赛中一次AC的DP题了 。。。
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<math.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<functional>
using namespace std;
typedef long long ll;
#define inf 1000000000
#define mod 1000000007
#define maxn 2005
#define PI 3.1415926
#define lowbit(x) (x&-x)
#define eps 1e-9
int dp[3505][3505];
char s1[maxn], s2[maxn];
int main(void)
{
int T, i, j, n, m;
scanf("%d", &T);
while (T--)
{
memset(s1, '\0', sizeof(s1));
memset(s2, '\0', sizeof(s2));
memset(dp, 0, sizeof(dp));
scanf("%s%s", s1 + 1, s2 + 1);
n = strlen(s1 + 1);m = strlen(s2 + 1);
dp[0][0] = 1;
for (i = 1;i <= m;i++)
{
for (j = 1;j <= n;j++)
{
if (s2[i] == s1[j] || s2[i] == '.')
{
if (dp[i - 1][j - 1])
dp[i][j] = 1;
if (s2[i - 1] == '*' && dp[i - 3][j - 1])
dp[i][j] = 1;
}
else if (s2[i] == '*')
{
if (dp[i - 2][0])
dp[i][0] = 1;
if (s2[i - 1] == s1[j] && dp[i - 1][j])
dp[i][j] = 1;
if (s2[i - 1] == '.' && s1[j] == s1[j - 1] && (dp[i - 1][j - 1] || dp[i - 1][j] || dp[i][j - 1]))
dp[i][j] = 1;
if (s2[i - 1] == s1[j - 1] && s1[j] == s1[j - 1] && (dp[i - 1][j - 1] || dp[i][j - 1]))
dp[i][j] = 1;
if (i >= 2 && dp[i - 2][j] || dp[i - 1][j])
dp[i][j] = 1;
}
//printf("%d %d %d\n", dp[i][j], i, j);
}
//printf("\n");
}
if (dp[m][n])
printf("yes\n");
else
printf("no\n");
}
return 0;
}