hdu 6170

dp:

http://blog.csdn.net/qq_28954601/article/details/77484676

#include <bits/stdc++.h>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 2525;
bool dp[maxn][maxn];
char s[maxn];
char t[maxn];
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        scanf("%s",s+1);
        scanf("%s",t+1);
        s[0]=t[0]='1';
        int len1=strlen(s)-1;
        int len2=strlen(t)-1;
        mt(dp,false);
        dp[0][0]=true;
        for(int i=1;i<=len2;++i){
            if(i==2&&t[i]=='*') dp[i][0]=true;
            for(int j=1;j<=len1;++j){
                if(t[i]==s[j]||t[i]=='.'){
                    dp[i][j]=dp[i-1][j-1]; //如果正常匹配的话,dpij就是从dpi-1j-1转移过来的
                }else if(t[i]=='*'){
                    dp[i][j]=dp[i-1][j]|dp[i-2][j];//如果这个*号的前面一个或者前面的第二个可以匹配到j位置的,则可以,我觉得是使用在多个*的时候的
                    if((dp[i-1][j-1]||dp[i][j-1])&&s[j-1]==s[j]) //如果是sj-1==sj的话,可以自己举例子看看就会清楚这是什么情况了
                        dp[i][j] = true;
                }
            }
        }
        puts(dp[len2][len1]?"yes":"no");
    }
    return 0;
}

 

posted on 2017-08-23 10:01  chinacwj1  阅读(108)  评论(0编辑  收藏  举报

导航