您的位置:首页 > 产品设计 > UI/UE

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

2017-09-18 11:01 483 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息