• 【记忆化搜索】bzoj1055 [HAOI2008]玩具取名


    f(l,r,c)表示sl...sr能否被合成字符c。

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int m[95],n;
    int mem[201][201][95];
    char s[201],To[95][17][3];
    bool equal(char a[],int la,int ra,char b[],int lb,int rb)
    {
    	for(int i=la,j=lb;i<=ra;++i,++j)
    	  if(a[i]!=b[j])
    	    return 0;
    	return 1;
    }
    bool f(int l,int r,char c)
    {
    	if(mem[l][r][c]!=-1) return mem[l][r][c];
    	if(l==r) return (s[l]==c?(mem[l][r][c]=1):(mem[l][r][c]=0));
    	if(r-l+1==2)
    	  {
    	  	for(int i=1;i<=m[c];++i)
    	  	  if(equal(s,l,r,To[c][i],0,1))
    	  	    return mem[l][r][c]=1;
    	  	return mem[l][r][c]=0;
    	  }
    	for(int i=l;i<r;++i)
    	  for(int j=1;j<=m[c];++j)
    	    if(f(l,i,To[c][j][0])&&f(i+1,r,To[c][j][1]))
    	      return mem[l][r][c]=1;
    	return mem[l][r][c]=0;
    }
    int main()
    {
    	scanf("%d%d%d%d",&m['W'],&m['I'],&m['N'],&m['G']);
    	for(int i=1;i<=m['W'];++i) scanf("%s",To['W'][i]);
    	for(int i=1;i<=m['I'];++i) scanf("%s",To['I'][i]);
    	for(int i=1;i<=m['N'];++i) scanf("%s",To['N'][i]);
    	for(int i=1;i<=m['G'];++i) scanf("%s",To['G'][i]);
    	scanf("%s",s); n=strlen(s);
    	memset(mem,-1,sizeof(mem));
    	bool flag=0;
    	if(f(0,n-1,'W')) putchar('W'),flag=1;
    	if(f(0,n-1,'I')) putchar('I'),flag=1;
    	if(f(0,n-1,'N')) putchar('N'),flag=1;
    	if(f(0,n-1,'G')) putchar('G'),flag=1;
    	if(!flag) printf("The name is wrong!");
    	puts("");
    	return 0;
    }
  • 相关阅读:
    icmp隧道手工操作
    Volatility2.4以上版本及fmem使用指南
    服务器解析漏洞总结
    Docker搭建独立服务器
    shell--(二)变量、字符串、数组、注释
    shell--(一)运行示例
    mysql 批量更新,没有就插入
    go 系统监控 cpu、内存等指标
    监控
    maven安装配置 每次都百度,麻烦
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4370838.html
Copyright © 2020-2023  润新知