hdu 6170 Two strings(线性dp)

来源:互联网 发布:dota2比赛数据直播 编辑:程序博客网 时间:2024/06/06 04:59

开始想的是用字符串进行暴力匹配,也想到了dp,但是水平不够啊,写不出来状态转移方程,dp总会有规律,每个状态由前面的推出后面的,根据状态的不同,进行一些判断,总有一天我能自己写出稍微复杂的dp状态转移方程。

#include<bits/stdc++.h>using namespace std;#define  pb push_backbool dp[2505][2505];char s1[2505],s2[2505];int main(){//freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);    int t;    scanf("%d%*c",&t);    while(t--)    {        gets(s1+1);        gets(s2+1);        memset(dp,0,sizeof(dp));        int len1=strlen(s1+1);        int len2=strlen(s2+1);        dp[0][0]=1;        for(int i=1; i<=len2; i++)        {            if(i==2&&s2[i]=='*')dp[i][0]=1;            for(int j=1; j<=len1; j++)            {                if(s2[i]=='.')dp[i][j]=dp[i-1][j-1];                else if (s2[i] == '*')                {                    dp[i][j] = max(dp[i - 2][j], dp[i - 1][j]);                    if (dp[i][j - 1] && s1[j] == s1[j - 1]) dp[i][j] = 1;                }                else                {                    if (s2[i] == s1[j])                    dp[i][j] = dp[i - 1][j - 1];                }            }        }        if(dp[len2][len1])printf("yes\n");        else printf("no\n");    }    return 0;}