HDU6170 Two strings(动态规划)

来源:互联网 发布:灵犀一动知乎 编辑:程序博客网 时间:2024/06/13 12:16

【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=6170

题目意思

有两个字符串,问你第二个字符串和第一个字符串能否匹配,第二个字符串有两种符号,’.’可以匹配任意字符,’*’表示前一个字符可以重复零次或多次(0次也就是删除前一个字符)

解题思路

用dp[i][j]来表示b串第i个字符和前j个字符是否匹配。
当第i个字符为。时。由于‘。’可以匹配任意字符所以dp[i][j]=dp[i-1][j-1]。
当第i个字符为*时。由于*可以复制和删除所以分两种情况考虑。当复制0次和1次时:pd[i][j]=dp[i-2][j]|dp[i-1]j
当复制多次时:判断a[j]==a[j-1]?&&dp[i-1][j-1]和dp[i][j-1]是否匹配,如果都满足dp[i][j]也满足。

推荐个详细链接

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

代码部分

#include <bits/stdc++.h>using namespace std;const int maxn=2600;char a[maxn],b[maxn];bool dp[maxn][maxn];int lena,lenb;int main(){    int T;    scanf("%d%*c",&T);    while(T--)    {        memset(dp,false,sizeof(dp));        a[0]=b[0]=1;        scanf("%s %s",a+1,b+1);        lena = strlen(a) - 1;        lenb = strlen(b) - 1;        dp[0][0]=true;        for(int i=1; i<=lenb; i++)        {            if(i>=2&&b[i]=='*')                dp[i][0] |= dp[i-2][0];            for(int j=1; j<=lena; j++)            {                if(b[i]=='.'||a[j]==b[i])                    dp[i][j]=dp[i-1][j-1];                else if(b[i]=='*')                {                    dp[i][j]=dp[i-2][j]|dp[i-1][j];   ///判断删减一个和不复制情况                    if((dp[i-1][j-1]||dp[i][j-1])&&a[j-1]==a[j])   ///判断复制情况                        dp[i][j] = true;                }            }        }        puts(dp[lenb][lena]?"yes":"no");    }    return 0;}
原创粉丝点击