题目链接

http://www.cnblogs.com/TheRoadToTheGold/p/8443668.html

\(Description\)

给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示。求有多少种合法的括号序列。答案对4294967296取模。

合法序列不能相交,如()[],([])是合法序列,而([)]是不合法的。

\(Solution\)

很重要的一点是,如果当前可以放右括号,那么方案是唯一的(不能相交)。

假设只有一种括号。

用\(f[i][j]\)表示\(1\sim i\),还有\(j\)个左括号未匹配的方案数。根据当前是什么转移即可。复杂度\(O(n^2)\)。

空间可以压成\(O(n)\)。考虑优化枚举范围,但是\(j\)的下界是\(0/1\),上界是\(\min(i,n/2)\),没啥好优化的。

只能尝试换种状态表示,\(f[i][j]\)表示\(1\sim i\),已经填了\(j\)个右括号的方案数。

则若\(i+1\) 为/可以放 左括号,\(f[i+1][j] =/+= f[i][j]\);若\(i+1\)可以放右括号,则\(f[i+1][j+1] += f[i][j]\)。

这样只有一种括号的答案是\(f[n][n/2]\)。假设原串有\(m\)个左括号,则25种括号的答案为\(25^{n/2-m}*f[n][n/2]\)(右括号确定,只需看左括号方案)。

\(j\)的下界是\(\max(1,i-n/2)\),上界可以按\(i/2\)算。平摊复杂度不知道,还是\(n^2\)的。。但跑得很快。

对\(4294967296=2^{32}\)取模相当于unsigned int自然溢出。

//1372ms	300KB
#include <cstdio>
#include <algorithm>
typedef unsigned int uint;
const int N=1e5+5; char s[N];
uint f[N]; int main()
{
int n; scanf("%d",&n);
if(n&1) return putchar('0'),0;
scanf("%s",s+1); f[0]=1; int m=0, n2=n>>1;
for(int i=1; i<=n; ++i)
if(s[i]=='?')
for(int j=i>>1,lim=std::max(1,i-n2); j>=lim; --j)
f[j]+=f[j-1];
else ++m;
if(n2<m) return putchar('0'),0;
for(int i=n2-m; i--; ) f[n2]*=25;
printf("%u",f[n2]); return 0;
}

Codeforces.314E.Sereja and Squares(DP)的更多相关文章

  1. codeforces 314E Sereja and Squares

    discription Sereja painted n points on the plane, point number i (1 ≤ i ≤ n) has coordinates (i, 0). ...

  2. Codeforces 425E Sereja and Sets dp

    Sereja and Sets 我们先考虑对于一堆线段我们怎么求最大的不相交的线段数量. 我们先按 r 排序, 然后能选就选. 所以我们能想到我们用$dp[ i ][ j ]$表示已经选了 i 个线段 ...

  3. codeforces 425D Sereja and Squares n个点构成多少个正方形

    输入n个点,问可以构成多少个正方形.n,xi,yi<=100,000. 刚看题的时候感觉好像以前见过╮(╯▽╰)╭最近越来越觉得以前见过的题偶尔就出现类似的,可是以前不努力啊,没做出来的没认真研 ...

  4. cf314E. Sereja and Squares(dp)

    题意 题目链接 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示.求有多少种合法的括号序列.答案对4294967296取模.合法序列不能相交,如()[],( ...

  5. CF 314 E. Sereja and Squares

    E. Sereja and Squares http://codeforces.com/contest/314/problem/E 题意: 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种 ...

  6. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  7. codeforces 425C Sereja and Two Sequences(DP)

    题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...

  8. CodeForces - 314C Sereja and Subsequences (树状数组+dp)

    Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ...

  9. Codeforces 314 E. Sereja and Squares

    http://codeforces.com/contest/314/problem/E 题意: 原本有一个合法的括号序列 擦去了所有的右括号和部分左括号 问有多少种填括号的方式使他仍然是合法的括号序列 ...

随机推荐

  1. JavaScript条件和循环以及异常处理

    JavaScript条件和循环以及异常处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.布尔类型(Boolean) 布尔类型仅包含真假,与Python不同的是其首字母小写. ...

  2. Swift学习笔记2

    1.函数参数都有一个外部参数名(external parameter name)和一个局部参数名(local parameter name).外部参数名用于在函数调用时标注传递给函数的参数,局部参数名 ...

  3. Brief History of Machine Learning

    Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, ...

  4. js简单的面试题

    1,js有哪些数据类型,数据类型的判断函数? String,Number,Boolean,Null,Undefined,Object 判断函数有:typeof,instanceof,construct ...

  5. assign()函数

    tf中assign()函数可用于对变量进行更新包括变量的value和shape. 涉及以下函数: tf.assign(ref, value, validate_shape = None, use_lo ...

  6. 洛谷 P1478 陶陶摘苹果(升级版)

    本萌新第一次发布题解,若有不严谨处请谅解. 我看了前面几位大佬的手笔,表示自己还是比较钟爱桶排序的.它非常简易直接,还省时间,尤其对于这类题目占用的的空间也很小. 我们看到题目下面的说明:xi< ...

  7. 02 workerman之GatewayWorker简单的demo 实现两端发送消息

    前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  8. flask基础之请求钩子(十二)

    前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ...

  9. 6 个 Linux 运维典型问题,大牛的分析解决思路在这里 【转】

    作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ...

  10. linux磁盘空间查看inode

    服务器一般是要求长期连续运行的,自动执行任务生成的各种文件及日志,可能使空间占满,从而造成业务故障,所以要定时清理. 一般来说,Linux空间占满有如两种情况: 1.空间被占满了 用df -k 可以看 ...