DP【洛谷P4290】 [HAOI2008]玩具取名
2018-10-30 20:58
260 查看
P4290 [HAOI2008]玩具取名
某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。
现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。
很早以前的考试题。
DP。
重点在预处理出每个区间能否凑成一个字母。
很简单,枚举断点即可。
code:
#include <iostream> #include <cstdio> #include <map> #include <cstring> using namespace std; const int wx=251; map<char,int> m; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();} return sum*f; } int f[wx][wx]; int zmj[wx][wx][wx]; int a[wx],flag[wx]; int ok1[wx],ok2[wx],ok3[wx]; char c[wx]; int tot; int main(){ m['W']=1; m['I']=2; m['N']=3; m['G']=4; for(int i=1;i<=4;i++)a[i]=read(); for(int i=1;i<=4;i++){ for(int j=1;j<=a[i];j++){ scanf("%s",c+1); ok1[++tot]=m[c[1]]; ok2[tot]=m[c[2]]; ok3[tot]=i; } } scanf("%s",c+1); int n=strlen(c+1); for(int i=1;i<=n;i++)zmj[i][i][m[c[i]]]=1; for(int len=1;len<=n;len++){ for(int i=1;i+len-1<=n;i++){ int j=i+len-1; for(int k=i;k<=j;k++){ for(int l=1;l<=tot;l++){ if(zmj[i][k][ok1[l]]&&zmj[k+1][j][ok2[l]]){ zmj[i][j][ok3[l]]=1; } } } } } for(int len=1;len<=n;len++){ for(int i=1;i+len-1<=n;i++){ int j=i+len-1; for(int l=1;l<=tot;l++){ if(zmj[i][j][l]){ f[i][j]=1; goto zz; } } f[i][j]=0x3f3f3f3f; for(int k=i;k<=j;k++){ f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); } zz:; } } for(int i=1;i<=tot;i++){ if(zmj[1] [ok3[i]])flag[ok3[i]]=1; } int fl=0; if(flag[1])printf("W"),fl=1; if(flag[2])printf("I"),fl=1; if(flag[3])printf("N"),fl=1; if(flag[4])printf("G"),fl=1; if(!fl)puts("The name is wrong!"); return 0; }
相关文章推荐
- 区间DP【p4290】[HAOI2008]玩具取名
- 【bzoj1055】【区间DP 记忆化搜索】[HAOI2008]玩具取名 把所给的字符串缩成WING这四个字符之一
- BZOJ 1055 [HAOI2008]玩具取名 DP
- [LUOGU] P4290 [BZOJ] 1055 [HAOI2008]玩具取名
- bzoj 1055: [HAOI2008]玩具取名【区间dp】
- BZOJ1055: [HAOI2008]玩具取名 区间DP
- bzoj 1055: [HAOI2008]玩具取名 dp
- bzoj 1055: [HAOI2008]玩具取名(区间DP)
- BZOJ 1055: [HAOI2008]玩具取名 记忆化搜索,DP
- [bzoj1055][HAOI2008]玩具取名(区间dp)
- 【BZOJ】1055: [HAOI2008]玩具取名(dp)
- 【bzoj 1055】[HAOI2008]玩具取名(字符串dp)
- [区间DP] bzoj1055 [HAOI2008]玩具取名
- bzoj1055: [HAOI2008]玩具取名 dp
- BZOJ 1055 (HAOI 2008)玩具取名 (区间覆盖DP)
- [BZOJ 1055][HAOI2008]玩具取名(DP)
- Luogu 4290 [HAOI2008]:玩具取名 区间DP
- 1055: [HAOI2008]玩具取名 区间DP
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
- [BZOJ1055][HAOI2008]玩具取名(dp)