BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
题目
某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后
他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。
现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。
输入格式
第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。接下来W行,每行两个字母,表示W可
以用这两个字母替代。接下来I行,每行两个字母,表示I可以用这两个字母替代。接下来N行,每行两个字母,表示N
可以用这两个字母替代。接下来G行,每行两个字母,表示G可以用这两个字母替代。最后一行一个长度不超过Len的
字符串。表示这个玩具的名字。
输出格式
一行字符串,该名字可能由哪些字母变形而得到。(按照WING的顺序输出)如果给的名字不能由任何一个字母
变形而得到则输出“The name is wrong!”
输入样例
1 1 1 1
II
WW
WW
IG
IIII
输出样例
IN
提示
W可以变成II所以IIII可以缩成WW IN均能变成WW所以WW又可以缩成I或者N 所以最终答案应该按照“WING”的顺序
输出IN
[数据范围]
100%数据满足Len<=200,W、I、N、G<=16
题解
设f[l][r][p]表示区间[l,r]能否转化为字符p
我们就有
f[l][r][p]=f[l][mid][x] &&f[mid+1][r][y]
其中xy表示p能变换成为的两个字符
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 205,maxm = 100005,INF = 1000000000;
const int n = 4;
const char* P = "WING";
int f[maxn][maxn][4],t[4],a[4][20][2];
int id[300],len;
char s[maxn];
int dp(int l,int r,int p){
if (l == r) return P[p] == s[l];
int& res = f[l][r][p];
if (res != -1) return res;
for (int i = 0; i < t[p]; i++)
for (int mid = l; mid < r; mid++)
if (dp(l,mid,a[p][i][0]) && dp(mid + 1,r,a[p][i][1]))
return res = 1;
return res = 0;
}
int main(){
memset(f,-1,sizeof(f));
char c,cc; id['W'] = 0; id['I'] = 1; id['N'] = 2; id['G'] = 3;
for (int i = 0; i < n; i++) cin>>t[i];
for (int i = 0; i < n; i++)
for (int j = 0; j < t[i]; j++){
cin>>c>>cc;
a[i][j][0] = id[c]; a[i][j][1] = id[cc];
}
scanf("%s",s + 1); len = strlen(s + 1);
bool flag = false;
for (int i = 0; i < 4; i++)
if (dp(1,len,i)) flag = true,putchar(P[i]);
if (!flag) puts("The name is wrong!");
return 0;
}
BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】的更多相关文章
- BZOJ1055: [HAOI2008]玩具取名[区间DP]
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1588 Solved: 925[Submit][Statu ...
- Bzoj 1055: [HAOI2008]玩具取名 (区间DP)
Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...
- 【BZOJ-1055】玩具取名 区间DP
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1560 Solved: 907[Submit][Statu ...
- bzoj1055: [HAOI2008]玩具取名(dp)
1055: [HAOI2008]玩具取名 题目:传送门 简要题意: 就是固定四个字母,给出这四个字母分别可以由哪两个字母组成,然后在给你一个字符串,要求把这个字符串还原成原始的四个字母的其中一个. 题 ...
- (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)
http://poj.org/problem?id=3186 Description FJ has purchased N (1 <= N <= 2000) yummy treats ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- uva 10891 区间dp+记忆化搜索
https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...
- loj 1031(区间dp+记忆化搜索)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
随机推荐
- SAP 文本框实例
SAP 文本框 简单实例 REPORT ZTEST001. DATA: OK_CODE LIKE SY-UCOMM, SAVE_OK LIKE SY-UCOMM. DATA: REF_EDIT_CTN ...
- redis操作帮助类
RedisHelper.java import redis.clients.jedis.*; import java.util.*; public class RedisHelper { privat ...
- 【shopex】真正可用的app开发机制
shopex的app开发机制详解 网上流传的shopex4.8.5的app开发教程,不仅说得不明不白,而且由于版本问题,照着做根本是做不成的. 知其然,亦要知其所以然. shopex提供了的一个干 ...
- java的有用基础知识(2013-05-02-bd 写的日志迁移
JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库.是java开发工具包 jre是java的运行环境(如果不做开发就不用安装jdk单独安装jre就可以运行java程序 ...
- python3 练习题100例 (十九)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """练习十九:计算1-2+3...+99中除了88以外所有数的和" ...
- C语言字符篇(五)内存函数
memcpy不可以把目的地址写成本身 但是memmove可以,因为它是先保存到临时空间 #include <string.h> void *memcpy(void *dest, con ...
- SpringMVC文件上传——bean的配置【org.springframework.web.multipart.commons.CommonsMultipartResolver】
一.简介 Spring MVC支持一个通用的多路上传解析器CommonsMultipartResolver,在Spring的配置文件中对CommonsMultipartResolver Bean进行配 ...
- 笔记-python-built-in functions-eval,exec,compile
笔记-python-built-in functions-eval,exec,compile 1. python代码执行函数 有时需要动态改变代码,也就是说代码需要是字符串格式,然后在按需要 ...
- scala高级特性-01
目标一:深入理解高阶函数 高阶函数 1.1概念 Scala混合了面向对象和函数式的特性, 我们通常将可以做为参数传递到方法中的表达式叫做函数. 在函数式编程语言中,函数是“头等公民”, 高阶函数包含: ...
- 4,版本控制git --忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定 ...