Hrbust 2230 括号子序列-A【dp】感谢Zqc!
2017-01-15 19:52
218 查看
括号子序列-A | ||||||
| ||||||
Description | ||||||
一段括号序列被称为平衡的,如果对于任意前缀,左括号的数目都不小于右括号。 给定一段括号序列,问有多少括号子序列是平衡的。(内容相同但位置不同的算两种。) | ||||||
Input | ||||||
输入一行括号序列,括号序列的长度 <= 100。 | ||||||
Output | ||||||
输出一行表示答案模 10^9 + 7 后的结果。 | ||||||
Sample Input | ||||||
(()()) ()() | ||||||
Sample Output | ||||||
18 4 | ||||||
Hint | ||||||
样例一: (_)___ (___)_ (____) _()___ _(__)_ _(___) ___()_ ___(_) _()()_ (_)()_ (_)(_) _()(_) ((_ _)) (()_)_ (()__) (__()) _(_()) (()()) | ||||||
Source | ||||||
"诚德软件杯"哈尔滨理工大学第四届ACM程序设计团队赛 |
考虑dp,设定dp【i】表示左括号比右括号多i个的方案数。
其状态转移方程:
①if(a【i】==‘(’)dp【i+1】+=dp【i】;
②if(a【i】==‘)’)dp【i-1】+=dp【i】;
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define mod 1000000007
char a[150];
int dp[150];
int main()
{
while(~scanf("%s",a))
{
int n=strlen(a);
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=0;i<n;i++)
{
if(a[i]=='(')
{
for(int j=130;j>=0;j--)
{
dp[j+1]+=dp[j];
dp[j+1]%=mod;
}
}
else
{
for(int j=1;j<130;j++)
{
dp[j-1]+=dp[j];
dp[j-1]%=mod;
}
}
}
printf("%d\n",dp[0]-1);
}
}
相关文章推荐
- [区间DP 思路题] BZOJ 4350 括号序列再战猪猪侠
- hrbust 哈理工oj 1834 括号匹配【好题】【floyd+dp】
- 【区间dp】括号序列再战猪猪侠
- 138.括号序列(区间型DP)
- dp 括号序列
- 【区间DP】codevs3657 括号序列题解
- UVA 1626 括号序列(区间dp)
- CodeVS3657 括号序列 解题报告【区间DP】
- 序列问题II HRBUST - 1597 [DP]
- dp uva1626 括号序列
- 九度OJ 1337:寻找最长合法括号序列 (DP)
- 1141 DP 括号序列
- 九度OJ 1337:寻找最长合法括号序列 (DP)
- 【基础练习】【区间DP】codevs3657 括号序列题解
- Hrbust 1835 最长递增子序列(dp)
- uva1626-括号序列(区间DP)
- 【经典dp】n数填m空,括号序列取第k项,最长非降序列计数及枚举,最短编辑距离
- 九度OJ 1342:寻找最长合法括号序列II (DP)
- hrbust 哈理工OJ 2010 二等队形【dp】【最长递减子序列问题】
- 九度OJ 1342:寻找最长合法括号序列II (DP)