动态规划

一开始定义为dp[l1][l2][l3][dd],表示用l1个{},l2个[],l3个(),深度为dd的方案数,后来不行。参考别人后,dp[l1][l2][l3][dd]表示深度小于等于dd的方案数,那么答案是

dp[l1][l2][l3][dd]-dp[l1][l2][l3][dd-1]

可以用分块和整块的思想来看这个问题

好像[[()][]] 这类的我们可以说它是整块,[][](),这类的我们可以说它是分块,我们在构建的dp数组的时候就是把其当做是分块来处理,然后使用乘法原理

例如dp[l1][l2][l3][dd],我们可以先构建一个小分块,用小分块的方案数*其实括号能组成的方案数,而这个小分块,其实本身是一个整块

我们来看这个小分块,最外层可以是(),[],{}

如果是(),那么里面必定全部是(),由题意的优先级可知,所以假设用i个()组成小分块,则dp[l1][l2][l3][dd]=dp[0][0][i-1][dd-1]*dp[l1][l2][l3-i][dd]

也就是用i个()组成小分块,已经用掉一个做外层,所以只剩下i-1个,并且深度也应该下降为dd-1,而剩下l1个{},l2个[],l3-i个(),他们再组合,两者相乘

同样的,如果小分块使用[]作为外层,那么里面可以使用[]和(),整个小分块假设使用了j个[],i个(),则dp[l1][l2][l3][dd]=dp[0][j-1][i][dd-1]*dp[l1][l2-j][l3-i][dd]

意思就是,用j个[],i个()去构建小分块,已经用掉一个[]作为外层,因此深度也应该下降为dd-1,剩下l1个{},l2-j个[],l3-i个(),他们再组合,两者相乘

同样的,如果小分块使用{}作为外层,那么里面可以使用{},[],(),假设分别用了k,j,i个,那么dp[l1][l2][l3][dd]=dp[k-1][j][i][dd-1]*dp[l1-k][l2-j][l3-i][dd]

小分块用掉一个{}作为外层,深度也应该下降为dd-1,再用剩下的括号去组合,两者相乘

整个算法中需要按照优先级去枚举小分块最外层的类型,应该()在最外层,接着是[],{},这个也是 值得思考的地方

接着就是记忆化实现,感觉这东西递推不好写

搜索的话就要知道边界

1.l1=0 && l2=0 && l3=0  , dp值为1

1.dd=0时,dp值为0

#include <cstdio>
#include <cstring>
#define MOD 11380
//#define LOCALint dp[15][15][15][35];
bool vis[15][15][15][35];int dfs(int l1,int l2,int l3,int dd)
{if(!l1 && !l2 && !l3){vis[l1][l2][l3][dd] = true;return dp[l1][l2][l3][dd] = 1;}if(!dd){vis[l1][l2][l3][dd] = true;return dp[l1][l2][l3][dd] = 0;}if(vis[l1][l2][l3][dd])return dp[l1][l2][l3][dd];int ans = 0;for(int i=0;i<=l3;i++){if(i){ans = (ans+dfs(0,0,i-1,dd-1) * dfs(l1,l2,l3-i,dd)) % MOD;ans %= MOD;}for(int j=0;j<=l2;j++){if(j){ans = (ans+dfs(0,j-1,i,dd-1) * dfs(l1,l2-j,l3-i,dd)) % MOD;ans %= MOD;}for(int k=1;k<=l1;k++){ans = (ans+dfs(k-1,j,i,dd-1) * dfs(l1-k,l2-j,l3-i,dd)) % MOD;ans %= MOD;}}}vis[l1][l2][l3][dd] = true;return dp[l1][l2][l3][dd] = ans;
}int main()
{#ifdef LOCALfreopen("input.txt","r",stdin);freopen("output.txt","w",stdout);#endifint l1,l2,l3,dd;memset(vis,0,sizeof(vis));scanf("%d%d%d%d",&l1,&l2,&l3,&dd);dp[l1][l2][l3][dd]=dfs(l1,l2,l3,dd);if(dd) dp[l1][l2][l3][dd-1]=dfs(l1,l2,l3,dd-1);//dp[l1][l2][l3][dd-1]=dfs(l1,l2,l3,dd-1);if(!dd) { printf("%d\n",dp[l1][l2][l3][dd]); return 0; }int a1=dp[l1][l2][l3][dd] , a2=dp[l1][l2][l3][dd-1];//printf("%d %d\n",a1,a2);printf("%d\n",((a1-a2)%MOD+MOD)%MOD);return 0;
}

转载于:https://www.cnblogs.com/scau20110726/archive/2013/03/03/2941322.html

poj 1187 陨石的秘密相关推荐

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

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

  2. 【POJ 1187】 陨石的秘密(dp)

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

  3. POJ1187 陨石的秘密 【题解】 线性DP

    题面:http://poj.org/problem?id=1187 很自然想到设f[i][j][k][d]为i个小括号,j个中括号,k个大括号,深度小于等于d的解. 那么答案自然就是f[i][j][k ...

  4. [恩难到了]陨石的秘密

    [描述] 公元19881231年,一颗巨大的陨石坠落在世界的政治文化中心cs.于是,灾难降临了,地球上出现了一系列反常的现象.当人们焦急万分的时候,一支由cs科学家组成的考察队赶到了出事地点.经过一番 ...

  5. [POJ1187] 陨石的秘密

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

  6. NOIP 好题推荐(DP+搜索+图论)POJ ZOJ

    NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS)  1090 Chain ->格雷码和二进制码 ...

  7. POJ 动态规划题目列表

    1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号: 容易:  1018, 1050 ...

  8. POJ 超详细分类

    POJ 各题算法 1000    A+B Problem            送分题     49%    2005-5-7 1001    Exponentiation         高精度   ...

  9. POJ的题目分类(两个版本)

    版本一: 简单题 1000A+B Problem 1001Exponentiation 1003 Hangover 1004 Financial Management 1005 I Think I N ...

最新文章

  1. 关于层的挡隔问题的探讨
  2. 5GS 协议栈 — PFCP 协议 — MAR 多接入规则
  3. JqueryMobile链接一个页面,而链接页面中图片需刷新才显示的问题
  4. conversion to dalvik format failed with error 1 解决
  5. 32位十六进制浮点数转换为十进制浮点数的方法
  6. 一套标准的ASP.NET Core容器化应用日志收集分析方案
  7. selenium firefox驱动_Python3+selenium配置常见报错解决方案
  8. ipa去除时间锁_Java中的锁以及sychronized实现机制(十)
  9. java 线程同步的list_java线程生产者与消费者实例(使用List实现同步)
  10. arcengine二次开发 获取当前的坐标系统(C++)
  11. java 8 64位官方下载_Java 8下载 Java 8.0U181官方正式版(32位/64位) 下载-脚本之家
  12. FreeCAD源码分析:Part模块
  13. 故宫,中国古代建筑艺术的奇葩
  14. 【元宇宙系列】元宇宙的创世居民——M 世代(Mateverse)
  15. 报修下单上门维修小程序开发制作
  16. 流程图,梳理基本流和备选流,编写测试用例
  17. JavaWeb核心技术系列教程(23)——JSP标签
  18. C语言使用信号量解决生产者消费者模型的同步问题
  19. Python(21):下载模块命令-pip
  20. nginx 学习笔记--Nginx正则表达式之匹配操作符

热门文章

  1. Java应用性能分析工具:async-profiler
  2. 程序员干累了,当个培训讲师?我亲身试水,讲讲感受
  3. 腾讯、阿里、百度高工都点头称赞的“Redis 实战超全笔记”,不看你就亏大发了
  4. i7 10750h是标压吗 属于什么档次 i7 10750h天梯图
  5. android studio 如何上传文件到模拟器的根目录
  6. 数量金融学(8):Markowitz均值-方差模型(2)
  7. UML时序图(Sequence Diagram)学习笔记
  8. 鸿蒙归蝶的反弹,诛仙前传鸿蒙副本任务详细攻略解读
  9. 鸿蒙归蝶的反弹,诛仙鸿蒙副本怎么过
  10. Neos Flow ActionController 返回JSON