解析

考虑到数据范围,其实我们可以用记搜.

设\(f[a][b][c][d]\)表示还剩\(a\)个'{}',\(b\)个"[]",\(c\)个"()",深度\(\leq d\)个数,(注意是小于等于\(d\),这样好统计一些).

然后,回到题目.

我们可以假设当前的串由两个串组成(其中一个可能是空串),

那么根据乘法原理,当前串的方案数就等于左边的串的方案数乘上右边的串的方案数.

因此,我们可以在\(dfs\)时枚举左边的串的情况(当然右边也可以你喜欢就好).

并考虑在套最外面的是什么.

所以,若当前枚举到的是\(i\)个"()",\(j\)个"[]",\(k\)个"{}",

那么当最外面是"()"时,方案数就应是\((0,0,i-1,d-1)*(a,b,c-i,d)\)(\(a,b,c\)为\(dfs\)时的状态)

而最外面是"[]"时,就是\((0,j-1,i,d-1)*(a,b-j,c-i,d)\),

同理,最外面是"{}"时,就是\((k-1,j,i,d-1)*(a-k,b-j,c-i,d)\),

而当\(a,b,c\)都为\(0\)时,\(f[a][b][c][d]\)就为\(1\)(别忘了\(d\)是表示深度为\(0\)~\(d\)的情况数).

当\(d\)=0时,\(f[a][b][c][d]=0\).

那么,打记搜就行了(最后别忘了减掉\(f[a][b][c][d-1]\))

上代码吧:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; inline int read(){
int sum=0,f=1;char ch=getchar();
while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
return f*sum;
} const int Mod=11380;
int f[15][15][15][35];
int la,lb,lc,ld; int dfs(int a/*"{}"的数量*/,int b/*"[]"的数量*/,int c/*"()"的数量*/,int d){
if(!a&&!b&&!c) return f[a][b][c][d]=1;
if(d==0) return f[a][b][c][d]=0;
if(f[a][b][c][d]>=0) return f[a][b][c][d];
f[a][b][c][d]=0;
for(int i=0;i<=c;i++){
if(i) f[a][b][c][d]=(f[a][b][c][d]+dfs(0,0,i-1,d-1)*dfs(a,b,c-i,d))%Mod;//"()"在最外面
for(int j=0;j<=b;j++){
if(j) f[a][b][c][d]=(f[a][b][c][d]+dfs(0,j-1,i,d-1)*dfs(a,b-j,c-i,d))%Mod;//"[]"在最外面
for(int k=0;k<=a;k++){
if(k) f[a][b][c][d]=(f[a][b][c][d]+dfs(k-1,j,i,d-1)*dfs(a-k,b-j,c-i,d))%Mod;//"{}"在最外面
}
}
}
return f[a][b][c][d];
} int main(){
memset(f,0xff,sizeof(f));
la=read();lb=read();lc=read();ld=read();
dfs(la,lb,lc,ld);
if(ld) dfs(la,lb,lc,ld-1);//因为小于等于d所以要减掉(d-1)的情况(就类似于前缀和)
printf("%d\n", ld?((f[la][lb][lc][ld]-f[la][lb][lc][ld-1])%Mod+Mod)%Mod:f[la][lb][lc][ld]);
return 0;
}

题解 【POJ1187】 陨石的秘密的更多相关文章

  1. [POJ1187] 陨石的秘密

    问题描述 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石 ...

  2. Genotype&&陨石的秘密

    Genotype: Genotype 是一个有限的基因序列.它是由大写的英文字母A-Z组成,不同的字母表示不同种类的基因.一个基因可以分化成为一对新的基因.这种分化被一个定义的规则集合所控制.每个分化 ...

  3. 【POJ1187】陨石的秘密

    题目大意: 定义一个串:只含有 '( )','[ ]','{ }',3种(6个)字符. 定义 SS 串: 空串是SS表达式. 若A是SS表达式,且A串中不含有中括号和大括号,则(A)是SS表达式. 若 ...

  4. poj[1187][Noi 01]陨石的秘密

    Description 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科 ...

  5. POJ 1187 陨石的秘密 (线性DP)

    题意: 公元11380年,一颗巨大的陨石坠落在南极.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点.经过一番侦察,科学家们发现陨石上 ...

  6. 【题解】P2922 [USACO08DEC]秘密消息Secret Message

    \(\text{Tags}\) 字典树,统计 题意: 给出两组\(\text{0/1}\)串\(\text{A,B}\),求解\(\text{A}\)中某串是\(\text{B}\)中某串的前缀,和\ ...

  7. AcWing 317. 陨石的秘密

    1 -> {} 2 -> [] 3 -> () \(f[d][a][b][c]\) 表示 \([i * 2 - 1, j * 2]\) 这段区间 深度为 d \(1\) 有 \(a\ ...

  8. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  9. $2019$ 暑期刷题记录1:(算法竞赛DP练习)

    $ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...

随机推荐

  1. Spring学习笔记(一)

    Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...

  2. 从入门到自闭之Python--RESTful API规范与序列化

    RESTful API规范 REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fieldi ...

  3. Ruby Rails学习中:网站导航,Bootstrap和自定义的CSS,局部视图

    添加一些结构 一.网站导航 1.添加一些结构后的网站布局文件 打开文件:app/views/layouts/application.html.erb 简单介绍一下,添加的代码: 我们从上往下看一下这段 ...

  4. Java IO与NIO的总结、比较

    一.IO流总结 1.Java I/O主要包括如下3层次: 流式部分——最主要的部分.如:OutputStream.InputStream.Writer.Reader等 非流式部分——如:File类.R ...

  5. 使用AI算法进行手写数字识别

    人工智能   人工智能(Artificial Intelligence,简称AI)一词最初是在1956年Dartmouth学会上提出的,从那以后,研究者们发展了众多理论和原理,人工智能的概念也随之扩展 ...

  6. lua加载DLL

    .cpp //若没有在项目属性--库文件.依赖文件.包含添加.则添加一下路径 #pragma  comment (lib,"lua5.1.lib") #include " ...

  7. Flink概述

    计算引擎 大数据计算引擎分为离线计算和实时计算,离线计算就是我们通常说的批计算,代表是Hadoop MapReduce.Hive等大数据技术.实时计算也被称作流计算,代表是Storm.Spark St ...

  8. git 查看当前仓库地址以及设置新的仓库地址

    1.查看当前仓库地址 git remote show origin 2.设置新的仓库地址 1.先登录 gitlab 查看当前仓库地址: 执行修改地址命令 git remote set-url orig ...

  9. DDOS攻击脚本

    import sysimport osimport timeimport socketimport random#Code Timefrom datetime import datetimenow = ...

  10. 关于学习电信nb-iot的小结

    关于这几天对nb-iot的学习的总结和遇到的坑 初步学习nb-iot,了解到了nb-iot对于传感器数据传输功能的强大: 废话不多说,对于nb-iot我们选择的有人的模块,选择B5频段也就是电信的nb ...