Codeforces.314E.Sereja and Squares(DP)
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)的更多相关文章
- codeforces 314E Sereja and Squares
		discription Sereja painted n points on the plane, point number i (1 ≤ i ≤ n) has coordinates (i, 0). ... 
- Codeforces 425E Sereja and Sets dp
		Sereja and Sets 我们先考虑对于一堆线段我们怎么求最大的不相交的线段数量. 我们先按 r 排序, 然后能选就选. 所以我们能想到我们用$dp[ i ][ j ]$表示已经选了 i 个线段 ... 
- codeforces 425D Sereja and Squares n个点构成多少个正方形
		输入n个点,问可以构成多少个正方形.n,xi,yi<=100,000. 刚看题的时候感觉好像以前见过╮(╯▽╰)╭最近越来越觉得以前见过的题偶尔就出现类似的,可是以前不努力啊,没做出来的没认真研 ... 
- cf314E. Sereja and Squares(dp)
		题意 题目链接 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种,用除x之外的小写字母a~z表示.求有多少种合法的括号序列.答案对4294967296取模.合法序列不能相交,如()[],( ... 
- CF 314 E. Sereja and Squares
		E. Sereja and Squares http://codeforces.com/contest/314/problem/E 题意: 给你一个擦去了部分左括号和全部右括号的括号序列,括号有25种 ... 
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
		[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ... 
- codeforces 425C Sereja and Two Sequences(DP)
		题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ... 
- CodeForces - 314C  Sereja and Subsequences (树状数组+dp)
		Sereja has a sequence that consists of n positive integers, a1, a2, ..., an. First Sereja took a pie ... 
- Codeforces 314 E. Sereja and Squares
		http://codeforces.com/contest/314/problem/E 题意: 原本有一个合法的括号序列 擦去了所有的右括号和部分左括号 问有多少种填括号的方式使他仍然是合法的括号序列 ... 
随机推荐
- JavaScript条件和循环以及异常处理
			JavaScript条件和循环以及异常处理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.布尔类型(Boolean) 布尔类型仅包含真假,与Python不同的是其首字母小写. ... 
- Swift学习笔记2
			1.函数参数都有一个外部参数名(external parameter name)和一个局部参数名(local parameter name).外部参数名用于在函数调用时标注传递给函数的参数,局部参数名 ... 
- Brief History of Machine Learning
			Brief History of Machine Learning My subjective ML timeline Since the initial standpoint of science, ... 
- js简单的面试题
			1,js有哪些数据类型,数据类型的判断函数? String,Number,Boolean,Null,Undefined,Object 判断函数有:typeof,instanceof,construct ... 
- assign()函数
			tf中assign()函数可用于对变量进行更新包括变量的value和shape. 涉及以下函数: tf.assign(ref, value, validate_shape = None, use_lo ... 
- 洛谷 P1478 陶陶摘苹果(升级版)
			本萌新第一次发布题解,若有不严谨处请谅解. 我看了前面几位大佬的手笔,表示自己还是比较钟爱桶排序的.它非常简易直接,还省时间,尤其对于这类题目占用的的空间也很小. 我们看到题目下面的说明:xi< ... 
- 02 workerman之GatewayWorker简单的demo 实现两端发送消息
			前端代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ... 
- flask基础之请求钩子(十二)
			前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ... 
- 6 个 Linux 运维典型问题,大牛的分析解决思路在这里 【转】
			作为一名合格的 Linux 运维工程师,一定要有一套清晰.明确的解决故障思路,当问题出现时,才能迅速定位.解决问题,这里给出一个处理问题的一般思路: 重视报错提示信息:每个错误的出现,都是给出错误提示 ... 
- linux磁盘空间查看inode
			服务器一般是要求长期连续运行的,自动执行任务生成的各种文件及日志,可能使空间占满,从而造成业务故障,所以要定时清理. 一般来说,Linux空间占满有如两种情况: 1.空间被占满了 用df -k 可以看 ... 
