1 输入只含小括号和中括号的序列,输出至少加入多少括号可以将此序列合法。
空序列自然合法
[])
输出1
(
]
)
]
(])]
(])]
输出2
方式为([])[]
而其实还有其它的方式:()[]
但是这样的话,就得加入4个。
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
def f(s,n):
if not len(s):
return n
else:
while len(s) and (s[-1] == "(" or s[-1] == "["):
n += 1
s.pop()
while len(s) and (s[0] == ")" or s[0] == "]"):
n += 1
s.pop(0)
ic=0
for i in range(1,len(s)):
ic=i
if s[i]==d1[s[0]]:
break
i=ic
if i==len(s)-1 and s[-1]!=d1[s[0]]:#未匹配到
n+=1
n=f(s[1:],n)
else:
n=f(s[1:i],n)
n=f(s[i+1:],n)
return n
s = list(input())
n = 0
d = ["()", "[]"]
d1={"(":")","[":"]"}
print(f(s,n))
这是典型的分治方法。复杂度为O(n^2),尚有改进的空间,因为可能重复遍历。
求一个积分的值
没啥说的
输入n,从n个人中任意选人,再从选出的人任意选出一个人作为队长,求种数
其实就是 Σ i = 0 n i C n i = n 2 n 2 \Sigma_{i=0}^niC_n^i=\frac{n2^n}{2} Σi=0niCni=2n2n
一个无向图的价值定义为,若g(x)=g(y)则价值加1,x≠y,g(x)为x邻边的集合。
这个就是比较邻接矩阵而两行是否相同,蛮力复杂度为O(V^2)。
用邻接表的话为O(VE)。改进的方向为x和y必然无邻接关系。可以少一些计算量。
一个有向图,有k个传送门,传送门为单向,可直接从一个顶点到达另一个顶点,此间不计距离,宝物在一个顶点处,求从另一个顶点到宝物的最小距离,若不能到达宝物处则返回-1.
其实还是dijkstra的应用,只不过这里如果存在传送门,则边的权值为0,如果最后返回还是正无穷,则不能到达。、
算法的主定理