您的位置:首页 > 其它

Hrbust 2230 括号子序列-A【dp】感谢Zqc!

2017-01-15 19:52 218 查看
括号子序列-A
Time Limit: 500 MSMemory Limit: 32768 K
Total Submit: 40(12 users)Total Accepted: 14(10 users)Rating: 







Special Judge: No
Description
一段括号序列被称为平衡的,如果对于任意前缀,左括号的数目都不小于右括号。
给定一段括号序列,问有多少括号子序列是平衡的。(内容相同但位置不同的算两种。)
Input
    输入一行括号序列,括号序列的长度 <= 100。
Output
    输出一行表示答案模 10^9 + 7 后的结果。
Sample Input
(()())
()()
Sample Output
18
4
Hint
样例一:

(_)___

(___)_

(____)

_()___

_(__)_

_(___)

___()_

___(_)

_()()_

(_)()_

(_)(_)

_()(_)

((_ _))

(()_)_

(()__)

(__())

_(_())

(()())

Source
"诚德软件杯"哈尔滨理工大学第四届ACM程序设计团队赛
思路(感谢Zqc的帮助以及高大上的O(n^2)思路):

考虑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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息