一开始以为是卡特兰数的性质,,后来发现其实是dp,但是用记忆化搜索感觉更方便一点
先来考虑字典树上的问题
设要求的序列长度是2n,我们用二元组(a,b)来表示前面长为a的序列中出现的 '(' - ')' = b
那么可以得知所有的符合这种要求的前缀的后缀形成的trie都是相同的
那么我们用二元组(i,j)来表示长为i的后缀中 ')' - '(' = j
只要这样一棵trie的最大匹配,就可以推出i+1的最大匹配 用dp[i][j]表示子树是二元组(i,j)对应的trie的最大匹配数
然后再来看最大匹配的问题:
每个结点只能选择一个子节点进行匹配,并且这个子节点不能再和下面一层匹配了
那么从底层往上考虑,2n层肯定没有匹配,2n-1层选一个叶子节点匹配,那么2n-2就没有匹配了
依次类推,可以发现奇数层的结点可以选一个子节点进行匹配,偶数层就没有匹配了
所以状态转移方程是:
因为是倒序往上的,dp[i][j]=dp[i-1][j+1]+dp[i-1][j-1]+(i%2==0)*flag,flag是子树个数
#include<bits/stdc++.h>
using namespace std;
#define maxn 2005
#define ll long long
#define mod 1000000007
ll n,dp[maxn][maxn];
int dfs(int i,int j){
if(dp[i][j]!=-)return dp[i][j];
if(i==){//长度为0时,差值也要为0
if(j==)return dp[i][j]=;
else return dp[i][j]=-;
}
if(i<j || j<)return dp[i][j]=-;
int flag=;
ll res1=dfs(i-,j+),res2=dfs(i-,j-);
if(res1>=)flag++;else res1=;
if(res2>=)flag++;else res2=; dp[i][j]=(res1+res2+(i%==)*flag)%mod;
if(flag)return dp[i][j];
return dp[i][j]=-;
}
int main(){
cin>>n;
memset(dp,-,sizeof dp);
cout<<dfs(*n,)<<endl;
// cout<<dp[5][1]<<endl;
}
 

trie上记忆化搜索,括号匹配——cf1152D好题!的更多相关文章

  1. 线性dp(记忆化搜索)——cf953C(经典好题dag和dp结合)

    非常好的题!和spoj 的 Mobile Service有点相似,用记忆化搜索很容易解决 看了网上的题解,也是减掉一维,刚好可以开下数组 https://blog.lucien.ink/archive ...

  2. B. Dispersed parentheses 记忆化搜索 + 括号序列的状压表示

    http://codeforces.com/gym/100633/problem/B B. Dispersed parentheses time limit per test 2 seconds me ...

  3. BNU 20860——Forwarding Emails——————【强连通图缩点+记忆化搜索】

    Forwarding Emails Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Orig ...

  4. (记忆化搜索 )The Triangle--hdu --1163

    http://poj.org/problem?id=1163     Description 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a ...

  5. hdu 1142(迪杰斯特拉+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  6. [bzoj2461][BeiJing2011][符环] (括号配对+记忆化搜索+高维dp)

    Description 在可以炼制魔力强大的法杖的同时,Magic Land 上的人们渐渐意识到,魔力强大并不一定能给人们带来好处——反而,由此产生的破坏性的高魔力释放,给整个大陆蒙上了恐怖的阴影.  ...

  7. UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  8. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  9. cdoj32-树上战争(Battle on the tree) 【记忆化搜索】

    http://acm.uestc.edu.cn/#/problem/show/32 树上战争(Battle on the tree) Time Limit: 12000/4000MS (Java/Ot ...

随机推荐

  1. [2019.03.21]LF, CR, CRLF and LFCR(?)

    开玩笑的啦,没有LFCR这种沙雕东西 为什么突然想起来写这个呢,是因为先前照着shell画llehs的时候,总报错,改正了以后又因为看不见而在上一篇博客上没有写明,所以过来好好写一写咯. 可以看出报错 ...

  2. [UVa-437] Color Length

    无法用复杂状态进行转移时改变计算方式:巧妙的整体考虑:压缩空间优化时间 传送门:$>here<$ 题意 给出两个字符串a,b,可以将他们穿插起来(相对位置不变).要求最小化ΣL(c),其中 ...

  3. MySQL 主从复制实战解析

    前言:前面几篇文章讲解了在应用层读写分离的配置和使用,这篇文章将来个主从复制的实战解析. 说明:主从复制,读写分离结构图 原理图 主库生成一个线程: Binlog Dump线程 1.此线程运行在主库, ...

  4. enumerate() 函数

    enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 具体参考博客http://www.runoob. ...

  5. jstl标签库需要两个包jstl.jar和standard.jar

    要使用jstl的标签库,将文件复制到WEB-INF/lib目录下,需要在jsp源文件的首部加入如下声明语句(一般放在page语句之后) 核心(core)   <%@ taglib uri=&qu ...

  6. jmeter+maven+jenkins自动化接口测试(下)

    maven+jmeter已经写好了,可以通过maven来执行jmeter的接口测试脚本,怎样实现定时执行测试并发送报告邮件就需要通过jenkins了(jmeter或者testng也可以结合不同的邮件j ...

  7. 第七周java学习总结

    学号 20175206 <Java程序设计>第七周学习总结 教材学习内容总结 第八章: 主要内容 String类 StringTokenizer类 Scanner类 StringBuffe ...

  8. 关于ajax的与后台Controller的交互 后台拿不到值

    话不多说 上代码 这是前段js的代码        传的两个参数    cLassid  和  userid $.ajax({ type:"post", url:"../ ...

  9. 计算机网络之JSONP跨域

    JSONP跨域实现原理 百度联想词跨域实现 一.JSONP跨域实现原理 1.Web页面使用<script>引入JS文件时不受同源策略的影响.准确的说,所有拥有src属性的标签都不受同源策略 ...

  10. HTML 重定向 页面跳转

    通过响应头重定向 响应状态 301 和 302 可以指定重定向URL, 推荐使用302 FOUND HttpServletResponse. static final int SC_MOVED_TEM ...