[bzoj1055][HAOI2008]玩具取名(区间dp)

来源:互联网 发布:中国蝉的种类知乎 编辑:程序博客网 时间:2024/05/08 22:08

传送门
数据范围200,O(n3)数据范围,还有替换,可以联想到区间dp。
读入时记录下来所有的替换方案,然后就可以记忆化搜索了。
状态:f(l,r,c)[l,r]c
然后dp即可。
代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inline int read(){    int x=0;char ch=' ';int f=1;    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();    return x*f;}int to[150];int cnt[4];int W,I,N,G,len;int g[4][20][2];bool f[201][201][4];int vis[201][201][4];int s[201];void dp(int l,int r,int c){    if(vis[l][r][c])return;    if(l==r){        f[l][r][c]=(s[l]==c);        return;    }    for(int i=l;i<r;i++){        for(int k=1;k<=cnt[c];k++){            dp(l,i,g[c][k][0]);            dp(i+1,r,g[c][k][1]);            if(f[l][i][g[c][k][0]]&&f[i+1][r][g[c][k][1]]){                f[l][r][c]=1;            }        }    }    vis[l][r][c]=1;}int main(){    to['W']=0;to['I']=1;to['N']=2;to['G']=3;    cnt[0]=W=read();cnt[1]=I=read();cnt[2]=N=read();cnt[3]=G=read();    for(int i=1;i<=W;i++){        char ch[3];        scanf("%s",ch);        g[0][i][0]=to[ch[0]];        g[0][i][1]=to[ch[1]];    }    for(int i=1;i<=I;i++){        char ch[3];        scanf("%s",ch);        g[1][i][0]=to[ch[0]];        g[1][i][1]=to[ch[1]];    }    for(int i=1;i<=N;i++){        char ch[3];        scanf("%s",ch);        g[2][i][0]=to[ch[0]];        g[2][i][1]=to[ch[1]];    }    for(int i=1;i<=G;i++){        char ch[3];        scanf("%s",ch);        g[3][i][0]=to[ch[0]];        g[3][i][1]=to[ch[1]];    }    char ch[201];    scanf("%s",ch);    len=strlen(ch);    for(int i=0;i<len;i++){        s[i+1]=to[ch[i]];    }    dp(1,len,0);    dp(1,len,1);    dp(1,len,2);    dp(1,len,3);    int flag=1;    if(f[1][len][0])printf("W"),flag=0;    if(f[1][len][1])printf("I"),flag=0;    if(f[1][len][2])printf("N"),flag=0;    if(f[1][len][3])printf("G"),flag=0;    if(flag)printf("The name is wrong!");    return 0;}
原创粉丝点击