博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】
阅读量:4329 次
发布时间:2019-06-06

本文共 1459 字,大约阅读时间需要 4 分钟。

题目链接:

 

题目分析

这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多。

都是将现在 Solve 的区间分成子区间,再求解子区间。

这道题 Solve(l, r, x) 求能否将 [l, r] 的区间还原成 x ,那么就将它分成两段,看是否能左段变成 p , 右段变成 q。 (x 能变成 pq)

 

代码

#include 
#include
#include
#include
#include
#include
using namespace std;const int MaxL = 200 + 5;char Ch[5] = {'W', 'I', 'N', 'G'};int len;int n[5], f[MaxL][MaxL][5];char S[MaxL];bool Tr[5][5][5];int Solve(int l, int r, int x) { if (f[l][r][x] != 0) return f[l][r][x]; if (l == r) { if (S[l] == Ch[x]) { f[l][r][x] = 1; return 1; } else { f[l][r][x] = -1; return -1; } } for (int i = l; i <= r - 1; ++i) { for (int j = 0; j < 4; ++j) { for (int k = 0; k < 4; ++k) { if (!Tr[x][j][k]) continue; if (Solve(l, i, j) == 1 && Solve(i + 1, r, k) == 1) { f[l][r][x] = 1; return 1; } } } } f[l][r][x] = -1; return -1;}int GetNum(char c) { for (int i = 0; i < 4; ++i) if (c == Ch[i]) return i; return -1;}int main() { for (int i = 0; i < 4; ++i) scanf("%d", &n[i]); char cc[3]; for (int i = 0; i < 4; ++i) { for (int j = 1; j <= n[i]; ++j) { scanf("%s", cc); Tr[i][GetNum(cc[0])][GetNum(cc[1])] = true; } } scanf("%s", S + 1); len = strlen(S + 1); bool Flag = false; for (int i = 0; i < 4; ++i) if (Solve(1, len, i) == 1) { printf("%c", Ch[i]); Flag = true; } if (!Flag) printf("The name is wrong!"); printf("\n"); return 0;}

  

转载于:https://www.cnblogs.com/JoeFan/p/4263680.html

你可能感兴趣的文章
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
生产订单“生产线别”带入生产入库单
查看>>
crontab导致磁盘空间满问题的解决
查看>>
java基础 第十一章(多态、抽象类、接口、包装类、String)
查看>>
Hadoop 服务器配置的副本数量 管不了客户端
查看>>
欧建新之死
查看>>
自定义滚动条
查看>>
APP开发手记01(app与web的困惑)
查看>>
笛卡尔遗传规划Cartesian Genetic Programming (CGP)简单理解(1)
查看>>
mysql 日期时间运算函数(转)
查看>>
初识前端作业1
查看>>
ffmpeg格式转换命令
查看>>
万方数据知识平台 TFHpple +Xpath解析
查看>>
Hive实现oracle的Minus函数
查看>>
秒杀多线程第四篇 一个经典的多线程同步问题
查看>>
RocketMQ配置
查看>>
vs code调试console程序报错--preLaunchTask“build”
查看>>
蚂蚁金服井贤栋:用技术联手金融机构,形成服务小微的生态合力
查看>>