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

题意:

公元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个数,我们称之为?神秘数?。 
密文中某些行的第五个数已经模糊不清,而这些数字正是揭开陨石秘密的钥匙。现在科学家们聘请你来计算这个神秘数。 

思路:

初始想法:我们令dp[l1][l2][l3][d]为用了l1个小括号,l2个中括号,l3个大括号,深度恰好为d时的方案数,现在我们来找状态之间的联系。然而我们可以发现一个残酷的事实,光用4个变量无法很好的表示一个状态。比如,我们添加一个小括号,当前状态带表的括号序列中,有一部分序列的深度增加了,有一部分没有增加,所以为了正确的转移状态,正常想法就是用状压之类的记录具体方案,然而这个题就。。。

我们可以发现,新添加一个括号,括号序列的深度最多增加1,要么就不变,所以,如果dp[l1][l2][l3][d]表示的是用了l1个小括号,l2个中括号,l3个大括号,深度小于等于d的方案数就很好办了,添加一个括号后从深度小于等于d的状态转移到深度小于等于d + 1的状态。

则等于d的方案数 = 小于等于d的方案数 - 小于等于d - 1的方案数。

还有一个问题,我们怎么不重不漏的写出状态转移的过程?我们可以发现,所有深度小于等于d的括号序列是由若干个深度小于等于d的嵌套的括号构成的,所以,我们可以这样转移状态:我们把当前状态分成2个部分,一个部分用来形成嵌套的括号,另一部分对应的是那个状态的方案数。我们枚举向最里面添加什么括号。因为大括号外面不能有其它的括号,所以当在最里面套大括号时,只能有大括号。例如,当前嵌套形的括号是{[()]},我们不能向里面添加{},但是添加小括号可以,变成{[(())]}。同理,枚举状态时,当添加的是中括号时,外面只能是中括号和大括号。

思路和代码实现参考了这篇博客:https://blog.csdn.net/Flying_Stones_Sure/article/details/7954114

代码:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int mod = 11380;
int dp[11][11][11][31];
bool v[11][11][11][31];
int dfs(int l1, int l2, int l3, int deep) {if (l1 == 0 && l2 == 0 && l3 == 0) {v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep] = 1;}if (deep == 0) {v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep]  = 0;}if (v[l1][l2][l3][deep])return dp[l1][l2][l3][deep];int ans = 0;for (int i = 0; i <= l3; i++) {if (i) {ans = (ans + dfs(0 , 0, i - 1, deep - 1) * dfs(l1, l2, l3 - i, deep)) % mod;}for (int j = 0 ;j <= l2; j++) {if (j) {ans = (ans + dfs(0, j - 1, i, deep - 1) * dfs(l1, l2 - j, l3 - i, deep)) % mod;}for (int k = 1; k <= l1; k++) {ans = (ans + dfs(k - 1, j, i, deep - 1) * dfs(l1 - k, l2 - j, l3 - i, deep)) % mod;}}}v[l1][l2][l3][deep] = 1;return dp[l1][l2][l3][deep] = ans;
}
int main() {int n, m, d, t;while(~scanf("%d%d%d%d", &n, &m, &t, &d)) {dfs(n, m, t, d);if(d) dfs(n, m ,t, d - 1);if(d) {printf("%d\n", (dp[n][m][t][d] - dp[n][m][t][d - 1] + mod ) % mod);} else {printf("%d\n", dp[n][m][t][d]);}}
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10339523.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bzoj2561 最小生成树

题意&#xff1a;给你无向图&#xff0c;给定一条边&#xff0c;求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解&#xff1a; 假装我们把边排序了&#xff0c;然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

Android应用开发—onSaveInstanceState方法什么时候被调用?

转载自onSaveInstanceState方法什么时候被调用?&#xff08;转载/整理&#xff09; 在 Activity 被销毁之前被调用来保存每个实例的状态&#xff0c;这样就可以保证该状态能够从 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢复过来。 本方法在 Activity 可能被销毁…

记一次phpstudy重启后Apache无法启动

相信大家都碰到过phpstudy中Apache无法启动的情况1、首先检查80端口是否占用&#xff0c;有的话就管理2、检查是否缺少vc9运行文件如果上述两种方法还不能解决问题就进入安装目录中Apache的bin目录下&#xff0c;在命令行窗口中执行httpd.exe&#xff0c;看看是否报错。我就是在…

C#任务调度——LimitedConcurrencyLevelTaskScheduler

这是参考大佬分享的代码写的有问题请提出指正&#xff0c;谢谢。using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TaskManager {class TaskFactoryMa…

同步本地远程分支 git remote prune origin

git remote prune origin &#xff08;不常用总忘记&#xff0c;记录下&#xff09;

264 参考帧 list0 list1

作了这么久的h264工作&#xff0c;这部分还一直从未去深入了解过&#xff0c;真是不求甚解啊&#xff0c;那帮老外的代码也写得太全了&#xff0c;该部分至今天才开始研究 首先参考帧这里关注的是两种&#xff0c;p ,b ,前向参考和后向参考 由白皮书中看到&#xff0c;p帧的参…

面试官问我:什么是JavaScript闭包,我该如何回答

闭包&#xff0c;有人说它是一种设计理念&#xff0c;有人说所有的函数都是闭包。到底什么是闭包&#xff1f;这个问题在面试是时候经常都会被问&#xff0c;很多小白一听就懵逼了&#xff0c;不知道如何回答好。这个问题也有很多朋友在公众号给李老师留言了&#xff0c;问题表…

robotframework基础学习(8)

变量的使用 在 Edit 标签页中主要分&#xff1a;加载外部文件、定义内部变量、定义元数据等三个部分。 &#xff08;1&#xff09;&#xff1a;加载外部文件Add Library&#xff1a;加载测试库&#xff0c;主要是[PYTHON 目录]\Lib\site-packages 里的测试库 Add Resource&…

版本字符串比较工具接口常用接口函数

版本升级比较常用的接口&#xff0c;字符串解析&#xff0c;不是很难&#xff0c;但没必须重复造轮子&#xff0c;保存一份网上搜到的实现&#xff1a; /*** 比较版本号的大小,前者大则返回一个正数,后者大返回一个负数,相等则返回0** param version1* param version2* return…

[蓝桥杯]ALGO-188.算法训练_P0504

Anagrams指的是具有如下特性的两个单词&#xff1a;在这两个单词当中&#xff0c;每一个英文字母&#xff08;不区分大小写&#xff09;所出现的次数都是相同的。例如&#xff0c;Unclear和Nuclear、Rimon和MinOR都是Anagrams。编写一个程序&#xff0c;输入两个单词&#xff0…

什么是3-2混合

正如上面所述&#xff0c;电影转换成视频时&#xff0c;每秒24帧必须转成每秒60场&#xff08;30帧&#xff09;。实现这一点的方法是把电影的第一帧显示3场&#xff0c;然后把第二帧显示2场&#xff0c;再把第三帧显示3场&#xff0c;以此类推。这个3-2-3-2-3-2的顺序就被称为…

shell 的here document 用法、输入/输出重定向

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 什么是Here Document Here Document 是在Linux Shell 中的一种特殊的重定向方式&#xff0c;它的基本的形式如下 cmd << delimiter…

beta第二天

团队成员 郑西坤 031602542 &#xff08;队长&#xff09; 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴&#xff1a;无 廖钰萍&#xff1a;无 吴志鸿&#xff1a;没有 雷光游&#xff1a;无 郑西坤…

void和void *

void f(void) { // 参数void可以省略cout << "aa"<<endl; } int t 22; int *a &t; void *p; // void *可以被赋值为其他类型 p a; cout << *(int *)p; // 使用的时候必须转到那个类型 转载于:https://www.cnblogs.com/pjishu/p/10343587.…

Android应用开发—Application

What is Application Application和Activity&#xff0c;Service一样是android框架的一个系统组件&#xff0c;当android程序启动时系统会创建一个application对象&#xff0c;用来存储系统的一些信息。通常我们是不需要指定一个Application的&#xff0c;这时系统会自动帮我们…

C语言符号

C语言运算符的优先级 一、运算符的优先级表 C 语言的符号众多&#xff0c;由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级&#xff0c;下表就是C 语言运算符的优先级表&#xff1a; 注&#xff1a;同一优先级的运算符&#xff0c;运算次序由结合…

手机按键中控运行思路的个人理解

目前而言基本的自己理解的中控多线程脚本无非就是两种1.主代码作为脚本功能的载体 另外开辟一个线程作为和中控保持联系的部分(下面只是思路 无法直接运行)Import "zm.luae" zm.Init /* 该思路下的基本流程 从UI界面获取到云账号 和 本地的配置信息---->根据自己…

burp过期了,换一个

先从吾爱破解论坛下载工具&#xff1a;https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip 工具运行需要Java环境&#xff0c;请自行安装&#xff0c;此处不赘述。解压完后双击keygen 填一下License Text(随意)&#xff0c;然后点击Run…

加载一张图片到ImageView到底占据多少内存

https://blog.csdn.net/BUG_delete/article/details/79557939 简介 Android中经常要通过ImageView进行图片资源显示。在加载图片时&#xff0c;首先要考虑的两个因素就是体验问题和性能问题。 其中&#xff0c;体验问题是指图片显示的是否正确&#xff08;例如Universal-Imag…

mysql -u root -p 解释

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 mysql -u 用户名 -p 密码 是连接数据库服务器的命令。要求你输入自己连接数据库的用户名和密码。 考虑密码如果直接明文写在这条命令行…