Description

公元11380年,一颗巨大的陨石坠落在南极。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察,科学家们发现陨石上刻有若干行密文,每一行都包含5个整数: 
1 1 1 1 6 
0 0 6 3 57 
8 0 11 3 2845 
著名的科学家SS发现,这些密文实际上是一种复杂运算的结果。为了便于大家理解这种运算,他定义了一种SS表达式: 
1. SS表达式是仅由'{','}','[',']','(',')'组成的字符串。 
2. 一个空串是SS表达式。 
3. 如果A是SS表达式,且A中不含字符'{','}','[',']',则(A)是SS表达式。 
4. 如果A是SS表达式,且A中不含字符'{','}',则[A]是SS表达式。 
5. 如果A是SS表达式,则{A}是SS表达式。 
6. 如果A和B都是SS表达式,则AB也是SS表达式。

例如 
()(())[] 
{()[()]} 
{{[[(())]]}} 
都是SS表达式。 
而 
()([])() 
[() 
不是SS表达式。

一个SS表达式E的深度D(E)定义如下: 
 
例如(){()}[]的深度为2。

密文中的复杂运算是这样进行的: 
设密文中每行前4个数依次为L1,L2,L3,D,求出所有深度为D,含有L1对{},L2对[],L3对()的SS串的个数,并用这个数对当前的年份11380求余数,这个余数就是密文中每行的第5个数,我们称之为?神秘数?。 
密文中某些行的第五个数已经模糊不清,而这些数字正是揭开陨石秘密的钥匙。现在科学家们聘请你来计算这个神秘数。 

Input

共一行,4个整数L1,L2,L3,D。相邻两个数之间用一个空格分隔。 
(0 <= L1 <= 10,0 <= L2 <= 10,0 <= L3 <= 10,0 <= D <= 30)

Output

共一行,包含一个整数,即神秘数。

Sample Input

   

Sample Output


题解

字符串dp

将每个字符串表示为四元组(d,a,b,c),

d->串的深度上限,即该串深度≤d,

a->L1,

b->L2,

c->L3,

计数原理:对于每个当前串A,将其分割为两个串加上任意括号得到的方案数必然为两串的方案数之积。

证明:

举个例子

例如字符串(d,a,b,c)分成了(d,x,y,z)和(d-1,u,v,w),前者包含了S、R、O的三种实现方案,后者包含了A、E、X、Q的四种实现方案

那么方案数为SA\SE\SX\SQ\RA\RE\RX\RQ\OA\OE\OX\Q

即3*4种

之后,对于每个字符串(d,a,b,c),对于深度d的计数可以只考虑(d,x,y,z)和(d-1,u,v,w)(依题意,AB字符串深度为A、B中最大深度)

在此基础上,枚举对该字符串加()[]{}的情况即可。

Rank Run ID User Memory Time Language Code Length Submit Time
69 16383436 ksq2013 848K 235MS G++ 874B 2016-12-11 17:44:52

程序算跑到比较快的。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int f[][][][];
int dp(int d,int a,int b,int c){
if(!(a|b|c))
return ;
int tmp=;
for(int i=;i<=c-;i++)
tmp=(tmp+f[d][a][b][c-i-]*f[d-][][][i])%;
for(int i=;i<=b-;i++)
for(int j=;j<=c;j++)
tmp=(tmp+f[d][a][b-i-][c-j]*f[d-][][i][j])%;
for(int i=;i<=a-;i++)
for(int j=;j<=b;j++)
for(int k=;k<=c;k++)
tmp=(tmp+f[d][a-i-][b-j][c-k]*f[d-][i][j][k])%;
return f[d][a][b][c]=tmp%;
}
int main(){
int l1,l2,l3,dep;
scanf("%d%d%d%d",&l1,&l2,&l3,&dep);
f[][][][]=;
for(int d=;d<=dep;d++)
for(int a=;a<=l1;a++)
for(int b=;b<=l2;b++)
for(int c=;c<=l3;c++)
f[d][a][b][c]=dp(d,a,b,c);
if(dep)
f[dep][l1][l2][l3]=(f[dep][l1][l2][l3]+-f[dep-][l1][l2][l3])%;
printf("%d\n",f[dep][l1][l2][l3]);
return ;
}

poj[1187][Noi 01]陨石的秘密的更多相关文章

  1. Genotype&&陨石的秘密

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

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

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

  3. POJ 1837 Balance 01背包

    题目: http://poj.org/problem?id=1837 感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇.. #include < ...

  4. POJ 3172 Scales (01背包暴力)

    题意:给定 n 个数,保证下一个数比上一个数和前一个数之和大,然后给定一个背包,问你最多放多少容积. 析:应该是很明显的01背包,但是可惜的是,数组开不出来,那就得考虑暴力,因为数不多,才几十而已,要 ...

  5. POJ 3211 (分组01背包) Washing Clothes

    题意: 小明有一个贤妻良母型的女朋友,他们两个一起洗衣服. 有M种颜色的N件衣服,要求洗完一种颜色的衣服才能洗另外一种颜色. 两人可以同时洗,一件衣服只能被一个人洗. 给出洗每件衣服所用的时间,求两个 ...

  6. POJ 2923 Relocation(01背包变形, 状态压缩DP)

    Q: 如何判断几件物品能否被 2 辆车一次拉走? A: DP 问题. 先 dp 求解第一辆车能够装下的最大的重量, 然后计算剩下的重量之和是否小于第二辆车的 capacity, 若小于, 这 OK. ...

  7. POJ 2184(01背包)(负体积)

    http://poj.org/problem?id=2184 http://blog.csdn.net/liuqiyao_01/article/details/8753686 对于负体积问题,可以先定 ...

  8. POJ 2923 【01背包+状态压缩/状压DP】

    题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...

  9. [POJ1187] 陨石的秘密

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

随机推荐

  1. 第 31 章 项目实战-PC 端固定布局[3]

    学习要点: 1.搜索区 2.插入大图 3.搜索框 主讲教师:李炎恢 本章主要开始使用学习用 HTML5 和 CSS3 来构建 Web 页面,第一个项目采用 PC 端固定布局来实现. 一.搜索区 本节课 ...

  2. Java动态代理全面分析

    代理模式 解说:给某一个对象提供一个代理,并由代理对象控制对原对象的引用: 代理模式需要以下几个角色: 1  主题:规定代理类和真实对象共同对外暴露的接口: 2  代理类:专门代理真实对象的类: 3 ...

  3. Thinkcmf 二次开发

    一.   创建模板 demo 1 Tpl下创建demo文件-----后台启用新的模板 (网站信息--模板方案) 2 在模板在tpl/demo目录下创建Portal目录,然后在Portal目录下创建in ...

  4. 如何使用grunt压缩js文件

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  5. How To Search and Restore files from Site Collection Recycle Bin

    $sitecoll = Get-SPSite "http://wheresmydoc.findit.com" $sitecoll.RecycleBin | ?{$_.Title - ...

  6. ImageLoader配合ImageSwitcher的使用

    先在MyApplication中初始化ImageLoader initImageLoader(getApplicationContext()); /** * 初始化ImageLoader * 如果你经 ...

  7. IOS开发基础知识--碎片3

    十二:判断设备 //设备名称 return [UIDevice currentDevice].name; //设备型号,只可得到是何设备,无法得到是第几代设备 return [UIDevice cur ...

  8. IOS开发基础知识--碎片28

    1:通用的weakify和strongify /** * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 * 调用方式: `@weakify_self`实现弱引用转换,` ...

  9. yii2下拉框带搜索功能

    简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程.作者:白狼 出处:http://www.manks.top/yii2_dropdown_search.html ...

  10. Ajax中Get请求与Post请求的区别

    Get请求和Post请求的区别 1.使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来 2.使用Get请求发送数据量小,Post请求发送数据量大 例子 页面的HTML代码: &l ...