当前位置:首页 > IT技术

poj1187 陨石的秘密

时间:2019-08-20 05:40:00来源:IT技术作者:SEO探针小编阅读:88次「手机版」
 

神秘的陨石

题目传送门poj1187" role="presentation" style="position: relative;">poj1187


题目

陨石的秘密" role="presentation" style="position: relative;">

TimeLimit:1000MS" role="presentation" style="position: relative;">TimeLimit:1000MS

MemoryLimit:10000K" role="presentation" style="position: relative;">MemoryLimit:10000K

TotalSubmissions:2514" role="presentation" style="position: relative;">TotalSubmissions:2514

Accepted:952" role="presentation" style="position: relative;">Accepted:952

Description" role="presentation" style="position: relative;">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" role="presentation" style="position: relative;">Input

共一行,4个整数L1" role="presentation" style="position: relative;">L1L2" role="presentation" style="position: relative;">L2L3" role="presentation" style="position: relative;">L3D" role="presentation" style="position: relative;">D。相邻两个数之间用一个空格分隔。

(0≤L1≤10,0≤L2≤10,0≤L3≤10,0≤D≤30)" role="presentation" style="position: relative;">0L1100L2100L3100D30

Output" role="presentation" style="position: relative;">Output

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

SampleInput" role="presentation" style="position: relative;">SampleInput

1 1 1 2

SampleOutput" role="presentation" style="position: relative;">SampleOutput

8


题解

这题显然是个DP。

状态f[a][b][c][d]" role="presentation" style="position: relative;">f[a][b][c][d]表示含有a" role="presentation" style="position: relative;">a对{},b" role="presentation" style="position: relative;">b对[],c" role="presentation" style="position: relative;">c对(),深度小于等于d" role="presentation" style="position: relative;">d的SS串的个数。

有一个直观的转移:套一个括号和两部分合并。

但是这样会有问题:ABC" role="presentation" style="position: relative;">ABC这种SS串会由于合并AB,C" role="presentation" style="position: relative;">ABC和合并A,BC" role="presentation" style="position: relative;">ABC而重复计数。

所以我们换个转移:(A)B" role="presentation" style="position: relative;">(A)B,即枚举一部分套一个括号。这样可以同时处理两种情况,不重不漏。


标程

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iOStream>
#include <algorithm>
using namespace std;

const int P = 11380;
const int M = 35;
const int N = 15;
int f[N][N][N][M];

int fun(int a, int b, int c, int d) {
    if (a + b + c == 0) return 1;
    int tmp = 0;
    for (int i = 0; i < c; i++)
        tmp = (tmp + f[a][b][c - i - 1][d] * f[0][0][i][d - 1]) % P;
    for (int i = 0; i < b; i++)
        for (int j = 0; j <= c; j++)
            tmp = (tmp + f[a][b - i - 1][c - j][d] * f[0][i][j][d - 1]) % P;
    for (int i = 0; i < a; i++)
        for (int j = 0; j <= b; j++)
            for (int k = 0; k <= c; k++)
                tmp = (tmp + f[a - i - 1][b - j][c - k][d] * f[i][j][k][d - 1]) % P;
    return tmp;
}

int main() {
    int l1, l2, l3, d;
    cin >> l1 >> l2 >> l3 >> d;
    f[0][0][0][0] = 1;
    for (int i = 0; i <= l1; i++)
        for (int j = 0; j <= l2; j++)
            for (int k = 0; k <= l3; k++)
                for (int l = 1; l <= d; l++)
                    f[i][j][k][l] = fun(i, j, k, l);
    if (d) f[l1][l2][l3][d] = (f[l1][l2][l3][d] - f[l1][l2][l3][d - 1] + P) % P;
    cout << f[l1][l2][l3][d] << endl;
    return 0;
}

相关阅读

COSTCO一年纯赚215亿会员费,背后到底有啥秘密?

从来不打广告的 COSTCO ,靠会员费就撑起了这家公司的一年超过 31 亿美元的利润。除了低价,COSTCO到底还有哪些营销秘密?

产品成长的秘密:从做一粒“种子”开始

产品成长,主要是针对产品本身所处的行业市场环境和竞品来出发的。所以,做产品从认真做一粒种子开始,千万别去过早修建那棵“参天大树

揭秘买卖高PR友情链接里面的秘密

大多站长都希望自己的站多交换些高PR的链接,或是直接去&ldquo;买&rdquo;高权重的链接。看看站长论坛的链接买卖区,PR4 PR5,6,7,甚至PR8

怎么破解别人qq号里面的秘密手机版(2019如何盗对方的q

【黑客V信:10484866】专业破解微信密码,开房查询,通话记录查询,查询微信聊天记录,非常靠谱!现在微信已经成为了一个比较好的聊天

最佳比例的秘密!教你如何在设计中充分运用黄金比例

吉萨金字塔、蒙娜丽莎、Twitter和百事可乐有什么共同点?答案很简单,它们的设计都遵循了黄金比例。作为一个常见的数学比例,黄金比例

分享到:

栏目导航

推荐阅读

热门阅读