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 题意: 原本有一个合法的括号序列 擦去了所有的右括号和部分左括号 问有多少种填括号的方式使他仍然是合法的括号序列 ...
随机推荐
- 设置 Linux 服务器中 MySQL 允许远程访问
开启 MySQL 远程访问权限: 在linux系统上登陆mysql服务. -- root 是用户名 [root@localhost ~]# mysql -u root -p Enter passwor ...
- .NET面试题系列(五)数据结构(Array、List、Queue、Stack)及线程安全问题
常用数据结构的时间复杂度 如何选择数据结构 Array (T[]) 当元素的数量是固定的,并且需要使用下标时. Linked list (LinkedList<T>) 当元素需要能够在列表 ...
- 数据绑定和第一个AngularJS Web应用
<!DOCTYPE html> <html lang="en" ng-app> <head> <meta charset="UT ...
- [机器学习&数据挖掘]SVM---核函数
1.核函数概述: 核函数通俗的来说是通过一个函数将向量的低维空间映射到一个高维空间,从而将低维空间的非线性问题转换为高维空间的线性问题来求解,从而再利用之前说的一系列线性支持向量机,常用的核函数如下: ...
- spring-boot-mybatis-多数据源
sql 语句 DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` bigint(20) NOT NULL AUTO_INCREMENT ...
- 【C++】cmdline——轻量级的C++命令行解析库
1.说明 cmdline是一个轻量级的c++命令行参数解析工具,全部源码只有一个cmdline.h头文件. 2.代码 20171210_命令行进行解析.cpp // 20171210_命令行进行解析. ...
- USB枚举过程【转】
转自:http://blog.csdn.net/myarrow/article/details/8270029 1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如 ...
- Linux内核中进程上下文、中断上下文、原子上下文、用户上下文的理解【转】
转自:http://blog.csdn.net/laoliu_lcl/article/details/39972459 进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不 ...
- js async await 终极异步解决方案
既然有了promise 为什么还要有async await ? 当然是promise 也不是完美的异步解决方案,而 async await 的写法看起来更加简单且容易理解. 回顾 Promise Pr ...
- JS实现文本中查找并替换字符
JS实现文本中查找并替换字符 效果图: 代码如下,复制即可使用: <!DOCTYPE html><html> <head> <style type=" ...