微软2017年预科生计划在线编程笔试-#1492 : Parentheses Sequence

http://hihocoder.com/problemset/problem/1492

题意理解:首先最少括号数就是从左到右,必须放(的时候才放。方案数挺难算的,但是其实最少是一个策略的限制条件,而且最少的时候,一定是放的(在原来的)的挨着的左边,而)在原来的(的挨着的右边,并且放下去的(和)一定是)))(((这样的。所以左和右分开算,算左的时候,到)时才认真算,分为)左边放了》=1个(和一个也不放来转移。最后放(的答案是,最右边原来的)能够达到的最少的遗留的(,这样就是最优的。

急转弯:算方案数的时候,最少反倒是一个策略限制,单独算(和),并且答案的返回也有限制。

算法:无。

数据结构:无。

from __future__ import print_function
#
#

'a good problem'

__author__ = 'hjkruclion'

import sys

def read_int():
    return list(map(int, sys.stdin.readline().split()))
def read_str():
    return sys.stdin.readline().split()[0]

M = int(1e9 + 7.1)
maxn = 1000 + 10
f = [[0 for i in range(maxn)] for j in range(maxn)]

def add(a, b):
    c = a + b
    if c >= M:
        c -= M
    return c

t = read_str()
n = len(t)
S = ['(' for _ in range(n + 1)]
for i in range(1, n + 1):
    S[i] = t[i - 1]

st = 0
res = 0
for i in range(1, n + 1):
    if S[i] == '(':
        st += 1
    else:
        if st >= 1:
            st -= 1
        else:
            res += 1
res += st
print(res, end=' ')

def solve():
    for i in range(0, n + 1):
        for j in range(0, n + 1):
            f[i][j] = 0
    f[0][0] = 1
    for i in range(1, n + 1):
        if S[i] == '(':
            for j in range(1, n + 1):
                f[i][j] = f[i - 1][j - 1]
        else:
            f[i][0] = add(f[i - 1][0], f[i - 1][1])
            for j in range(1, n + 1):
                if j + 1 <= n:
                    t = f[i - 1][j + 1]
                else:
                    t = 0
                f[i][j] = add(t, f[i][j - 1])
    # for i in range(1, n + 1):
    #     for j in range(0, n + 1):
    #         print(i, j, f[i][j])
    for i in reversed(range(1, n + 1)):
        if S[i] == ')':
            for j in range(0, n + 1):
                if f[i][j] != 0:
                    return f[i][j]
    return f[0][0]

ans1 = solve()
for i in range(1, n // 2 + 1):
    t = S[i]
    S[i] = S[n - i + 1]
    S[n - i + 1] = t
for i in range(1, n + 1):
    if S[i] == '(':
        S[i] = ')'
    else:
        S[i] = '('
# print(S[1:])
ans2 = solve()
ans = ans1 * ans2 % M
print(ans)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值