bzoj 1055

来源:互联网 发布:网络钢琴 编辑:程序博客网 时间:2024/06/05 11:47

玩具起名~~

题目不复制了~~

dp~

dp【i】【j】【k】表示 第i个到第j个区间可不可以用k来表示

一开始没有注意到 可以由一个字母转化过来蒙圈了许久。╮(╯_╰)╭

注意需要加一个记忆化搜索,,,这个加的我好心累、

时间优化还是挺明显的orz

有图有真相

下面是代码:

#include<cstdio>#include<algorithm>#include<cstring>//by mars_chusing namespace std;int n[5];char c[5][21][5];char s[205];int dp[205][205][5];char m[5]={'W','I','N','G'};int hash(char c){    if(c == 'W') return 0;    if(c == 'I') return 1;    if(c == 'N') return 2;    if(c == 'G') return 3;}bool dfs(int l,int r,int k){    if(l == r) return (s[l] == m[k]);    if(dp[l][r][k] != -1) return dp[l][r][k];    for(int i=0;i<n[k];i++)    {        for(int j=l;j<r;j++)        {            if(dfs(l,j,hash(c[k][i][0])) && dfs(j+1,r,hash(c[k][i][1])))            {                dp[l][r][k]=1;                return true;            }         }    }    dp[l][r][k]=0;    return false;} int main(){    memset(dp,-1,sizeof(dp));     for(int i=0;i<4;i++)    {        scanf("%d",&n[i]);    }    for(int i=0;i<4;i++)    {        for(int j=0;j<n[i];j++)        {            scanf("%s",c[i][j]);        }    }    scanf("%s",s);    int len=strlen(s);    int flag=0;    for(int i=0;i<4;i++)    {        if(dfs(0,len-1,i)) flag=1,printf("%c",m[i]);   //注意是len-1     }    if(flag == 0) printf("The name is wrong!\n");    return 0;}
0 0
原创粉丝点击