BZOJ1055

传送门:BZOJ1055

傻逼题,然而我居然连状态定义都没有想出来。

记f(i,j,k)表示[i,j]的字符能否由k字符扩展来,转移就是怎么暴力怎么来

我觉得我要摆脱题解依赖了……必须摆脱!

代码上的小细节见下。

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

struct Node{
    int l[18];
    int r[18];
    int size;
};

Node num[5];
const char p[5]={‘a‘,‘W‘,‘I‘,‘N‘,‘G‘};

bool used[200][200][5];
bool f[200][200][5];
char c[205];

bool Dp(int l,int r,int k)
{
    if(l==r)
        return c[l]==p[k];
    if(used[l][r][k])
        return f[l][r][k];
    used[l][r][k]=true;
    for(int i=1;i<=num[k].size;i++)
        for(int j=l;j<r;j++)
            if(Dp(l,j,num[k].l[i])&&Dp(j+1,r,num[k].r[i]))
                return f[l][r][k]=true;
    return f[l][r][k]=false;
}

void Readdata()
{
    freopen("loli.in","r",stdin);
    for(int i=1;i<=4;i++)
        scanf("%d",&num[i].size);
    scanf("\n");
    for(int i=1;i<=4;i++)
        for(int j=1;j<=num[i].size;j++){
            char a,b;
            scanf("%c%c\n",&a,&b);
            for(int k=1;k<=4;k++){
                if(p[k]==a)
                    num[i].l[j]=k;
                if(p[k]==b)
                    num[i].r[j]=k;
            }
        }
    scanf("%s",c+1);
}

void Solve()
{
    bool flag=false;
    for(int i=1;i<=4;i++)
        if(Dp(1,strlen(c+1),i)){
            printf("%c",p[i]);
            flag=true;
        }
    if(!flag)
        printf("The name is wrong!");
}

void Close()
{
    fclose(stdin);
    fclose(stdout);
}

int main()
{
    Readdata();
    Solve();
    Close();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 09:30:50

BZOJ1055的相关文章

[bzoj1055][HAOI2008]玩具取名_区间dp

玩具取名 bzoj-1055 HAOI-2008 题目大意:给你一个用W,I,N,G组成的字符串,给你一些这四个字符之间的变换规则,每一个变换规则都是由一个字符变成两个字符,问这个字符串是否可能是由一个单独的字符变成的. 注释:$1\le Len\le 200$,每种字符的变换规则<=16 想法:刚看见题以为又是什么单词接龙之类的题,然后看了一眼数据范围... ...还是不会. 查了题解,发现是一个挺不常见的bool区间dp 状态:dp[i][j][c]表示[i,j]这段区间是否能变成c字符,c

BZOJ1055: [HAOI2008]玩具取名

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 820  Solved: 482[Submit][Status] Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的

【BZOJ-1055】玩具取名 区间DP

1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1560  Solved: 907[Submit][Status][Discuss] Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长.现在,他想请你猜猜某一个很长的名字,最初可能是由

bzoj1055: [HAOI2008]玩具取名(dp)

1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题解: 一开始看题有点瞎...想了想是一道超级大难题... 其实就是一个很简单的DP... 定义发f[i][j][s]:表示在字符串中i~j这个区间是否可以组合成为字符s 转移很容易就可以想出来:因为如果f[i][k][s1]==f[k+1][j][s2]==1(i<=k<=j) &&

动态规划刷题记录1(不定期更新~)

Dp刷(chao)题记录&题(fu)解(zhi) 1.bzoj1055 [HAOI2008]玩具取名 题目大意:字典中有四个字母,’w’\’i’\’n’\’g’,给出每个字母的转换关系,即某个单个字母可以转换为两个字母.给出一个文本,求最初的可能文本(刚开始有且仅有一个字母). 题解:明显是一道区间dp嘛~.设状态为文本[i,j]内的字母可以转化为字母[k],即f(i,j,k),要解状态的可能性.转移思路,自然是枚举i到j内的断点,再枚举关系.那么初始的状态转移方程就是 f[i][j][k]=f

HAOI2008题解

又来写题解辣-然而并不太清楚题目排列情况...不管辣先写起来- T1:[bzoj1041] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1041 一个赤果果的数学题--- 首先坐标轴上一定有四个, 最大公约数搞一下然后判断一下就可以啦,细节全部都在代码- 代码如下: 1 var i,j,ans,d:longint; 2 t,r,m:int64; 3 function flag(x,y:longint):longint; 4 var t

BZOJ 刷题记录 PART 2

[前言]最近感觉状态不错.做题几乎不看题解了.(一群大牛(FZ&WCY)在旁边喷:你刷水题有意思!)但是至少这也是一种进步吧.特别是权限题中有很多思维题. [BZOJ1055]就是一个简单的区间DP.重要代码: for (l=2;l<=L;l++) for (i=1;i<=L-l+1;i++) { j=i+l-1; for (k=0;k<4;k++) for (cut=i;cut<j;cut++) for (p=0;p<4;p++) if (f[i][cut][p])

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ