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

来源:互联网 发布:js遍历jsong数组赋值 编辑:程序博客网 时间:2024/06/05 23:06

括号子序列-ATime Limit: 500 MSMemory Limit: 32768 KTotal Submit: 40(12 users)Total Accepted: 14(10 users)Rating: Special Judge: NoDescription

一段括号序列被称为平衡的,如果对于任意前缀,左括号的数目都不小于右括号。

给定一段括号序列,问有多少括号子序列是平衡的。(内容相同但位置不同的算两种。)

Input    输入一行括号序列,括号序列的长度 <= 100Output    输出一行表示答案模 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 1000000007char 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);    }}




0 0
原创粉丝点击