bzoj-1055玩具取名区间dp

DaD3zZ DaD3zZ     2022-08-05     527

关键词:

1055: [HAOI2008]玩具取名

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1560  Solved: 907
[Submit][Status][Discuss]

Description

  某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。

Input

  第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。接下来W行,每行两个字母,表示W可以用这两个字母替代。接下来I行,每行两个字母,表示I可以用这两个字母替代。接下来N行,每行两个字母,表示N可以用这两个字母替代。接下来G行,每行两个字母,表示G可以用这两个字母替代。最后一行一个长度不超过Len的字符串。表示这个玩具的名字。

Output

  一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出)如果给的名字不能由任何一个字母变形而得到则输出“The name is wrong!”

Sample Input

1 1 1 1
II
WW
WW
IG
IIII

Sample Output

IN

HINT

W可以变成II所以IIII可以缩成WW IN均能变成WW所以WW又可以缩成I或者N 所以最终答案应该按照“WING”的顺序

输出IN 

[数据范围]

100%数据满足Len<=200,W、I、N、G<=16

Source

Solution

区间DP

暴力转移就可以...就是比人家慢个10多倍罢了

f[l][r][k]表示[l,r]是否能压成k

然后枚举区间长度,枚举左端点,枚举WING,枚举WING的每种缩,枚举断点

总之就是暴力转移,然后就可以了

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map> 
using namespace std;
char s[5][17][3],S[210],N[5],c[5];
map<char,int>mp;
bool f[210][210][5];
int main()
{
    scanf("%d%d%d%d",&N[1],&N[2],&N[3],&N[4]);
    mp[W]=1,mp[I]=2,mp[N]=3,mp[G]=4;
    c[1]=W,c[2]=I,c[3]=N,c[4]=G;
    for (int i=1; i<=4; i++)
        for (int j=1; j<=N[i]; j++)
            scanf("%s",s[i][j]+1);
    scanf("%s",S+1); int len=strlen(S+1);
    for (int i=1; i<=len; i++) f[i][i][mp[S[i]]]=1;
    for (int i=2; i<=len; i++)
        for (int j=1; j<=len; j++)
            if (j+i-1<=len)
                {
                    int L=j,R=j+i-1;
                    for (int k=1; k<=4; k++)
                        for (int l=1; l<=N[k]; l++)
                            for (int m=L; m<R; m++)
                                f[L][R][k]|=(f[L][m][ mp[ s[k][l][1] ]] & f[m+1][R][ mp[ s[k][l][2] ]]);
                }
    for (int i=1; i<=4; i++) if (f[1][len][i]) putchar(c[i]);
    if (!f[1][len][1] && !f[1][len][2] && !f[1][len][3] && !f[1][len][4]) puts("The name is wrong!");
    return 0;
}

 

bzoj1055[haoi2008]玩具取名区间dp

1055:[HAOI2008]玩具取名TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 2204  Solved: 1288[Submit][Status][Discuss]Description  某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩 查看详情

bzoj1055玩具取名(区间dp)

很显然的区间DP,定义dp[i][j][k],如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符。#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<vector>#include<queue>#include& 查看详情

bzoj1055[haoi2008]玩具取名区间dp(代码片段)

题面题目传送门解法直接区间dp即可时间复杂度:(O(16n^3))代码#include<bits/stdc++.h>#defineN210usingnamespacestd;structNodeintx,y;a[5][N];ints[5],p[5][5][5];boolf[N][N][5],vis[N][N][5];intnum(charch)if(ch==‘W‘)retur 查看详情

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

1055:[HAOI2008]玩具取名题目:传送门 简要题意:    就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个。题解:  一开始看题... 查看详情

题解bzoj1055:[haoi2008]玩具取名(动态规划)

bzoj1055,懒得复制,戳我戳我Solution:区间动规(以后开始动规会在solution前面标注是啥动规我觉的这道题挺难想了,但其实状态定义了一下子就出来了(还是不行啊)我们定义状态\(dp[i][j][sta]\),表示在\(i\)到\(j\)区间可不可以合成... 查看详情

bzoj千题计划199:bzoj1055:[haoi2008]玩具取名

http://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间DPdp[i][j][k]表示区间[i,j]能否合成k #include<cstdio>#include<cstring>usingnamespacestd;boolok[4][4][4];chars[201];booldp[201][201][ 查看详情

bzoj1055[haoi2008]玩具取名

题目链接一个人首先给一个玩具取名为WING中的一个字符,且W,I,N,G分别可以变成w,i,n,g种两个WING中的字符,给出玩具最终的名字,问最初的名字可以为那些字符定义dp[l][r][k]为[l,r]是否可以变成一种第k个字符```cppincludeincludeincludeusingname... 查看详情

bzoj1055[haoi2008]玩具取名

【bzoj1055】[HAOI2008]玩具取名2014年12月1日3,0111Description某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个... 查看详情

[bzoj1055][haoi2008]玩具取名(代码片段)

Description  某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得... 查看详情

bzoj1055[haoi2008]玩具取名

Description  某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得... 查看详情

bzoj1055:[haoi2008]玩具取名

Description  某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得... 查看详情

bzoj1055:[haoi2008]玩具取名

Description某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长... 查看详情

bzoj1055haoi2008玩具取名动态规划

题目大意:给定一个由‘W‘,‘I‘,‘N‘,‘G‘构成的字符串。给定一些规则。这些规则能够将两个字符合成为一个,比如"II"能够合成为‘W‘,"WW"能够合成为‘I‘或者‘N‘求这个字符串能够终于合成为哪几种字... 查看详情

玩具取名(代码片段)

区间dp思路挺好想的,不过实现......极其鬼畜令dp[i][j][k]表示i->j区间能否合为k,pan[b][c]表示b,c字母能合并为哪些字母。转移方程:[dp[l][r][a]=dp[l][r][a]|(dp[l][k][b]capdp[k+1][r][c])Kepsilon[l,r],pan[b][c]==a]code#include<iostream>#in 查看详情

[haoi2008]玩具取名-区间dp(代码片段)

某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。现在,... 查看详情

[luogu4290haoi2008]玩具取名(dp)(代码片段)

传送门Solution裸区间DPCode#include<map>#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#defineF(i,a,b)for(regi 查看详情

题解玩具取名(代码片段)

Question题目大意不说了。区间(dp)设计(dp[i][j][k])表示区间([i,j])能不能由字符(k)变化得到那么有一个状态转移方程是:[dp[i][j][lay[l][0]]=dp[i][mid][lay[l][1]]>0,dp[mid+1][j][lay[l][2]]>0](lay)数组是存储的变化信息。(lay[l][1])表示的变化信息... 查看详情

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

Dp刷(chao)题记录&题(fu)解(zhi)1.bzoj1055[HAOI2008]玩具取名题目大意:字典中有四个字母,’w’’i’’n’’g’,给出每个字母的转换关系,即某个单个字母可以转换为两个字母。给出一个文本,求最初的可... 查看详情