这道题很明显是区间DP。

为了方便表示,我们可以将‘W’、‘I’、‘N’、‘G’分别设为1、2、3、4。

另外,DP可能有点丑,记忆化搜索可能写起来更容易理解。

AC代码:

#include <bits/stdc++.h>

using namespace std;//使用标准名字空间

inline int read()//快速读入
{
int f=1,x=0;
char c=getchar(); while(c<'0' || c>'9')
{
if(c=='-')f=-1;
c=getchar();
} while(c>='0' && c<='9')
{
x=x*10+c-'0';
c=getchar();
} return f*x;
} string s;
int b[5][5][5],dp[210][210][5],p[130],d[5],len,fl;//定义变量 int main()
{
p['W']=1,p['I']=2,p['N']=3,p['G']=4;//将字母表示成数字 for(register int i=1; i<=4; i++)//输入
{
d[i]=read();
} for(register int i=1; i<=4; i++)
{
for(register int j=1; j<=d[i]; j++)
{
cin>>s;//输入每个字母可以代表的子字符串 b[p[s[0]]][p[s[1]]][i]=1;//标记这个字符串由i演变而来
}
} cin>>s;//输入玩具名称 len=s.size();//记录名称长度 for(register int i=0; i<len; i++)
{
dp[i][i][p[s[i]]]=1;//标记第i个位置
}
//开始DP主过程
for(register int i=len-1; i>=0; i--)
{
for(register int j=i+1; j<len; j++)//枚举区间(i,j)
{
for(register int k=1; k<5; k++)//枚举字母
{
for(register int l=1; l<5 && dp[i][j][k]==0; l++)//如果(i,j)不含有字母k,就枚举字母l
{
for(register int o=1; o<5 && dp[i][j][k]==0; o++)//同理
{
if(b[l][o][k]==0)//如果字母组合(l,o)不能由字母k演变来
{
continue;//就继续循环
} for(register int w=i; w<j && dp[i][j][k]==0; w++)
{
dp[i][j][k]|=(dp[i][w][l] & dp[w+1][j][o]);//主要DP步骤,要仔细体会
}
}
}
}
}
}
//输出
if(dp[0][len-1][1])
{
cout<<'W';
fl=1;
} if(dp[0][len-1][2])
{
cout<<'I';
fl=1;
} if(dp[0][len-1][3])
{
cout<<'N';
fl=1;
} if(dp[0][len-1][4])
{
cout<<'G';
fl=1;
}
//无解输出
if(fl==0)
{
cout<<"The name is wrong!";
} return 0;//完美结束
}

最新文章

  1. LZ77压缩算法编码原理详解(结合图片和简单代码)
  2. AIX下tar解包问题
  3. Sybase 数据库新增用户,赋权
  4. WinForm------TreeList实现鼠标经过节点背景色改变
  5. 安装oracleASM
  6. Oracle常见的几种等待事件
  7. Java网络编程(模拟浏览器访问Tomcat服务器)
  8. 【Unity Shaders】使用CgInclude让你的Shader模块化——创建CgInclude文件存储光照模型
  9. MapReduce分析明星微博数据
  10. SwiftDate 浅析
  11. Linux下Samba服务器的安装和配置
  12. spring整合dubbo[单机版]
  13. CSS3-1
  14. 剑指offer 5.栈和队列 用两个栈实现队列
  15. centos7系统优化-转载
  16. Codeforces 555C Case of Chocolate 其他
  17. layui 导出表格数据
  18. 《Kubernetes权威指南》笔记-Pod、容器与Node的关系
  19. 【Web】CSS实现绝对定位元素水平垂直居中
  20. myeclipse cannot connect to vm

热门文章

  1. C语言 typedef struct _STUDENT {}STUDENT,*PSTUDENT;
  2. python 的eval函数
  3. Pandas 中对列 groupby 后进行 sum() 与 count() 区别及 agg() 的使用方法
  4. 04-SV连接设计和测试平台
  5. Linux C++ 单链表添加,删除,输出,逆序操作
  6. 03_TypeScript函数
  7. ControlTemplate in WPF
  8. 用Java在excel单元格中设置超链接
  9. MyEclipse-2017破解过程
  10. BK: How to read a book 第四篇