1055: [HAOI2008]玩具取名
Description
Input
Output
Sample Input
II
WW
WW
IG
IIII
Sample Output
HINT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
using namespace std;
int m,n,a,b,ans,c,d,q,r,w[][];
char ch1,ch2;
bool f[][][];
string s,s1;
int main()
{
cin>>a>>b>>c>>d;
for (int i=;i<=a+b+c+d;i++)
//这里我们用一个w数组来储存读入的元素,举个例子,现在w可转换为IG,那么w[i][1]储存I,w[i][2]储存G,w[i][3]则储存w,i的取值由这两个字母是第几个被输入的决定。
if (i>a+b+c) w[i][]=;
else if (i>a+b) w[i][]=;
else if (i>a) w[i][]=;
else w[i][]=;
cin>>s1;
ch1=s1[];
ch2=s1[];
if (ch1=='W') w[i][]=; else if (ch1=='I') w[i][]=;else if (ch1=='N') w[i][]=;else if (ch1=='G') w[i][]=;
if (ch2=='W') w[i][]=; else if (ch2=='I') w[i][]=;else if (ch2=='N') w[i][]=;else if (ch2=='G') w[i][]=;
}
cin>>s;
n=s.size();
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int k=;k<=;k++)
f[i][j][k]=false; //f[i][j][k]表示这段区间内能否由k转换而来。先全都初始化。
for (int i=;i<=n-;i++)//原先序列中有的先赋值为true,i从0开始是因为c++中字符串中的第一个字符储存在0号位中。
{
if (s[i]=='W') f[i+][i+][]=true;
else if (s[i]=='I') f[i+][i+][]=true;
else if (s[i]=='N') f[i+][i+][]=true;
else if (s[i]=='G') f[i+][i+][]=true;
}
for (int len=;len<=n;len++)//枚举区间长度
for (int i=;i<=n-len+;i++)//区间左边
{
r=i+len-;//区间右边
m=i;//我们通过m把区间分为两部分
while (m<=r-)//枚举m
{
for (int k=;k<=a+b+c+d;k++)//枚举那些转换公式
f[i][r][w[k][]]=(f[i][m][w[k][]])&&(f[m+][r][w[k][]])||(f[i][r][w[k][]]); //核心部分,我们去判断由m分开的区间左部分和右部分,是否刚好可以转换成w[k]这个公式的左边字母和右边字母,(即两边都为TRUE)
若可以,那么这个区间就可以是w[k][3]中的字母转换而来,赋值为TRUE。
m+=;
}
}
ans=;
for (int i=;i<=;i++)
if (f[][n][i]==true) //按顺序输出
{
if (i==) printf("W");
if (i==) printf("I");
if (i==) printf("N");
if (i==) printf("G");
ans+=;//记录是否有答案
}
if (ans==) printf("The name is wrong!");//没答案
return ;
}
唔,复杂度是O(200^3*64),不知是因为实际上没有200^3,还是数据水,还是写着10s的原因,很险地过了。。。。
1055: [HAOI2008]玩具取名的更多相关文章
- BZOJ 1055 [HAOI2008]玩具取名
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1119 Solved: 653[Submit][Statu ...
- bzoj 1055 [HAOI2008]玩具取名(区间DP)
1055: [HAOI2008]玩具取名 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1258 Solved: 729[Submit][Statu ...
- Bzoj 1055: [HAOI2008]玩具取名 (区间DP)
Bzoj 1055: [HAOI2008]玩具取名 (区间DP) 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1055 区间动态规划和可 ...
- 【BZOJ】1055: [HAOI2008]玩具取名(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1055 我竟然都没往dp这个方向想.....百度了下看到标题是dp马上就会转移了QAQ... 设d[i ...
- [BZOJ 1055][HAOI2008]玩具取名(DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1055 分析: 比较难想的dp f[i][j][c]表示i..j能否压缩成字符c 那么怎 ...
- 1055: [HAOI2008]玩具取名 - BZOJ
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...
- [BZOJ 1055] [HAOI2008] 玩具取名 【记忆化搜索】
题目链接:BZOJ - 1055 题目分析 这种类似区间 DP 的记忆化搜索都是很相近的,比如字符串压缩和字符串扩展都差不多. 都是将现在 Solve 的区间分成子区间,再求解子区间. 这道题 Sol ...
- BZOJ 1055: [HAOI2008]玩具取名(记忆化搜索)
http://www.lydsy.com/JudgeOnline/problem.php?id=1055 题意: 思路:记忆化搜索. #include<iostream> #include ...
- 1055. [HAOI2008]玩具取名【区间DP】
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替, ...
随机推荐
- 使用属性动画简单实现view飞入效果
比较简单的效果,可以用来菜单飞入之类,作为记录吧, package com.test.animation; import android.app.Activity; import android.os ...
- yield个人理解及简明示例
1.写法有2种:yield return <expression>和yield breakyield用于在迭代中返回一个值,并将值带入下一次迭代中.yield break则意味着停止迭代. ...
- Visual Studio Enterprise 2015下载 Update3
Visual Studio 2015 是一个丰富的集成开发环境,可用于创建出色的 Windows.Android 和 iOS 应用程序以及新式 Web 应用程序和云服务. 1.适用于各种规模和复杂程度 ...
- java环境
http://www.iyunv.com/thread-65867-1-1.html http://www.360doc.com/content/15/0525/19/21365845_4732029 ...
- JS和CSS关于大小写的区分
方法: document.getElementById("xx").style.xxx中的所有属性是什么 盒子标签和属性对照 CSS语法(不区分大小写) JavaScript语法( ...
- Python list 操作
创建列表sample_list = ['a',1,('a','b')] Python 列表操作sample_list = ['a','b',0,1,3] 得到列表中的某一个值value_start = ...
- nodejs生成UID(唯一标识符)——node-uuid模块
unique identifier 惟一标识符 -->> uid 在项目开发中我们常需要给某些数据定义一个唯一标识符,便于寻找,关联. node-uuid模块很好的提供了这个 ...
- [cocos2d-js]cc.RenderTexture几种用法(数字图片、刮刮乐效果)
[转]http://blog.csdn.net/realcrazysun1/article/details/42393629 本文基于cocos2d-js 3.0版本引擎开发 RenderTextur ...
- C++STL算法速查
非变易算法 /* 第21章 非变易算法 Non-modifying sequence operations 21.0 advance, distance 为了了解模板,先了解一下这两个迭代器操作函 ...
- 三天没有写题了,罪过!--Hash Table Start
(1)Island Perimeter 解题思路: 在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 ...