[bzoj2461][BeiJing2011][符环] (括号配对+记忆化搜索+高维dp)
Description
在可以炼制魔力强大的法杖的同时,Magic Land 上的人们渐渐意识到,魔力
强大并不一定能给人们带来好处——反而,由此产生的破坏性的高魔力释放,给
整个大陆蒙上了恐怖的阴影。
可控的魔力释放,成为了人们新的追求。这种控制魔力释放的技术,也就是
被现在的我们熟知的“魔法”。在远古时期,“魔法”由法师们口口相传,但也因
为这样,很多“古代魔法”已经成为传说——因为那时没有良好的记录魔法的方
法。
后来,天才法师Ferdinand 发现了一种记录魔法的方法:将一种特殊材料做
成的正反面均有 1行 N列格子的带子的一端扭转 180度之后与另一端粘贴,
这样就得到了一个仅有一面的环,被称为“符环” (Spell Ring) 。
符环上的某一个格子为“起始位”,并标有起始方向,这样,我们就可以给
这个环上的每一个格子进行编号: 起始位编号是 0,向起始方向移动一格为 1,
这样,一共有 2N 个格子,并且第 i 个格子的背面(虽然带子是一面的,但
是仍然有“背面”这个概念)是第(i+N) mod N 格。
法师们将魔法用一个由魔法标记“(”和“)”组成的串表示。人们发现,
所有魔法对应的串都为合法的括号序列,并且任何一个合法的括号序列都
对应一个魔法。可以发现,合法的括号序列长度均为偶数,这样就可以把一个
魔法写在符环之中:从起始格开始,向起始方向,依次写入魔法标记。
这种特殊的材料使得符环带有美丽的色彩:假如一个格子的两面写有相同
的魔法标记(即:假设这个带子是透明的,两个魔法标记重合),那么这
个格子会变为绯红色(Scarlet) ;反之,若两面的魔法标记不同,会变为深
蓝色(Deep blue)。
现在,你得到了一些古代的符环,由于年代久远,魔法标记已经变得模糊不
清,但是颜色依然保持完好。你希望知道:给定的颜色信息,对应了多少种
不同的魔法?
Input
第一行包含一个正整数T,表示符环的数量。
接下来的 T 行,每一行包含一个符环的颜色信息:
一个长度为 N的由大写字母“S”和“D”组成的字符串。
“S”表示绯红色(Scarlet),“D”表示深蓝色(Deep blue)。
从左到右依次为第 0、1、……、N-1 个格子的颜色。
Output
包含T 行:
每行一个正整数,表示该符环对应的不同魔法的数量。
Sample Input
D
SSD
SDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSDSD
Sample Output
HINT
第一张符环对应了唯一的魔法“()”。
第二张符环对应了唯一的魔法“()(())”。
对于第三张符环,它的长度为50,颜色是交替的。可以证明,它不能对应任
何魔法。
对于全部的数据:N ≤ 50,T ≤ 10。
Solution
和黑书上的一题很像,即括号序列
可以直接得出状态,f[now][a][b][c][d],表示当前是字符串now位,当前位的左边有a个'(',左边有b个')',右边有c个')',右边还有d个'(',注意,这些都是代表了未配对的数值。由于左边有b个未配对的字符是一定不合法的且无用的,可以将此维省略
设f[now][x][y][z]代表,当前是字符串now位,当前位的左边有x个'(',右边有y个')',右边还有z个'('
考虑记忆化搜索,分类讨论一下就行了
#include<stdio.h>
#include<string.h>
#define ll long long
char s[];
int T,len;
ll f[][][][];
ll dfs(int x,int dx,int dy,int dz){
if(x==len+)
return dx==dy&&!dz;
ll &ans=f[x][dx][dy][dz];
if(ans!=-)return ans;
ans=;
if(s[x]=='S'){
ans+=dfs(x+,dx+,dy,dz+);
if(dx)
ans+=dz?dfs(x+,dx-,dy,dz-):dfs(x+,dx-,dy+,dz);
}
else{
if(dx)ans+=dfs(x+,dx-,dy,dz+);
ans+=dz?dfs(x+,dx+,dy,dz-):dfs(x+,dx+,dy+,dz);
}
return ans;
}
int main(){
scanf("%d",&T);
for(;T;T--){
memset(f,-,sizeof(f));
scanf("%s",s+);
len=strlen(s+);
printf("%lld\n",dfs(,,,));
}
return ;
}
[bzoj2461][BeiJing2011][符环] (括号配对+记忆化搜索+高维dp)的更多相关文章
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】
P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 2476 String painter(记忆化搜索, DP)
题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...
- hdu_3562_B-number(记忆化搜索|数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:给你一个n,为比n小的能整除13并数字中有13的数有多少个 题解:记忆化搜索:记dp[i] ...
- BZOJ1415[Noi2005]聪聪和可可——记忆化搜索+期望dp
题目描述 输入 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- POJ-1088 滑雪 (记忆化搜索,dp)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86318 Accepted: 32289 Description Mich ...
- HDU 4597 Play Game (记忆化搜索博弈DP)
题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...
随机推荐
- bzoj1537
dp+树状数组 一维排序,一维离散化,然后跑lis,其实就是一个二维偏序 #include<bits/stdc++.h> using namespace std; ; int dp[N], ...
- http-2.2
HTTP-2.2 httpd 配置文件的组成: grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global En ...
- 3-3 编程练习:jQuery键盘事件案例
3-3 编程练习 完善下面的代码,在input框中输入内容的时候同样显示在下面的p标签中 <!DOCTYPE html> <html lang="zh-CN"&g ...
- Linux C编程之二:Linux基础
1.Linux的特点 (1)Linux就是一个操作系统(作为用户和计算机之间接口的软件程序) 注:操作系统的功能:命令解释,进程管理,内存管理,输入输出(I/O)操作和外围设备管理,文件管理 (2)特 ...
- (数论)51NOD 1135 原根
设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) 给出1个质数P,找出P最小的原根. Input 输入1个质数P(3 <= P &l ...
- 转 PHP - AJAX 与 PHP
1. AJAX 被用于创建交互性更强的应用程序. AJAX PHP 实例 下面的实例将演示当用户在输入框中键入字符时,网页如何与 Web 服务器进行通信: 实例 尝试在输入框中输入一个名字,如:Ann ...
- 20 如何在C#中存一批数据,数组
使用软件的一个重要原因,是因为软件可以帮我们重复处理很多事情.在前面我们已经讲到了循环.循环就是为了重复处理一个事情.那么我们有没有想过,我们要重复处理的一批数据怎么在程序里存放呢? 举个例子吧. 我 ...
- Java编程思想读书笔记_第三章
本章提到的关于==的部分,一个完整的实验如下: class Test { public static void main(String[] args) { Integer i = new Intege ...
- Chromium浏览器编译成功庆祝
1.什么是Chromium Chromium 是Google公司的开源项目 Google浏览器 最新版360浏览器 都是在Chromium的基础上重新编译的. 2.什么是双核浏览器 ...
- union与union all
union在合并A和B表的时候会先将B表中的数据与A表进行比较,若A表中已存在,则忽略. union all合并时则不比较,直接将A表与B表进行合并. 因此,若已知A与B不存在重复数据,那么union ...