微软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)
题意理解:首先最少括号数就是从左到右,必须放(的时候才放。方案数挺难算的,但是其实最少是一个策略的限制条件,而且最少的时候,一定是放的(在原来的)的挨着的左边,而)在原来的(的挨着的右边,并且放下去的(和)一定是)))(((这样的。所以左和右分开算,算左的时候,到)时才认真算,分为)左边放了》=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)
相关文章推荐
- Queen Attack -- 微软2017年预科生计划在线编程笔试第二场
- 微软2017年预科生计划在线编程笔试-#1489 : Legendary Items
- 微软2017年预科生计划在线编程笔试第二场-#1499 : A Box of Coins
- 微软2017年预科生计划在线编程笔试
- 微软2017年预科生计划在线编程笔试第二场-#1498 : Diligent Robots
- 微软2017年预科生计划在线编程笔试第二场-#1500 : EL SUENO
- 【微软2017年预科生计划在线编程笔试 B】Tree Restoration
- 微软2017年预科生计划在线编程笔试 题目1 : Legendary Items
- 【微软2017年预科生计划在线编程笔试 A】Legendary Items
- [hihocoder1489][微软2017年预科生计划在线编程笔试][Legendary Items]
- 【微软2017年预科生计划在线编程笔试第二场 B】Diligent Robots
- 【微软2017年预科生计划在线编程笔试第二场 A】Queen Attack
- 微软2017年预科生计划在线编程笔试-#1490 : Tree Restoration
- 微软2017年预科生计划在线编程笔试-#1491 : Monster Killing
- 微软2017年预科生计划在线编程笔试第二场-#1497 : Queen Attack
- 微软2017年预科生计划在线编程笔试第二场B题Diligent Robots
- 【微软2017年预科生计划在线编程笔试第二场 A】Queen Attack
- 微软2017年预科生计划在线编程笔试,附解题思路
- 微软2017年预科生计划在线编程笔试 A Legendary Items
- Parentheses Sequence微软编程笔试