和谐的奶牛
题目大意:
有一些括号(保证是合法的,合法:每一个左括号都有自己配对的有括号),现在要将这些括号分为两组(其中一组可以为空),分完组后括号的顺序要和原来的一样,问有多少种方法使括号分组,结果要对2012取模
样例输入
(())
样例输出
6
数据范围限制
数据说明:序列的长度是1到1000。
提示
说明:
The following breed assignments work:
解题思路:
这道题就是一道DP题,一开始我们用f[i][j][k]来表示,前i个括号,序列一和序列二左括号比右括号多的数目,但后来发现i+j是已经确定的了,他们想加就是前i个左括号比右括号多的数目,所以我们只保留i和j,k就不保留了,然后选的时候就是f[i-1][j-a[i]](左括号是1,右括号是-1),不选的时候就是f[i-1][j]
代码:
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int n,f[1005][505],a[1005],b[1005];
string str;
int main()
{cin>>str;n=str.size();//长度for (int i=1;i<=n;++i)if (str[i-1]=='(') a[i]=1,b[i]=b[i-1]+1;//记录和求前缀和else a[i]=-1,b[i]=b[i-1]-1;f[0][0]=1;//预处理for (int i=1;i<=n;++i)for (int j=0;j<=b[i];++j)//最多能多出几个f[i][j]=(f[i-1][j-a[i]]+f[i-1][j])%2012;//状态转移方程printf("%d",f[n][0]);return 0;
}