题目:
在一个图书馆的长廊里,有一些座位和装饰植物排成—列。给你一个下标从О开始,长度为n的字符串corridor,
它包含字母'S’和‘P’,其中每个’S’表示—个座位,每个‘P’表示—株植物。
在下标0的左边和下标n - 1的右边已经分别各放了一个屏风。你还需要额外放置—些屏风。
每一个位置i - 1和i 之间( 1<= i <= n -1),至多能放一个屏风。
请你将走廊用屏风划分为若干段,且每一段内都恰好有两个座位,而每一段内植物的数目没有要求。
可能有多种划分方案,如果两个方案中有任何-个屏风的位置不同,那么它们被视为不同方案。
请你返回划分走廊的方案数。由于答案可能很大,请你返回它对7+10^9取余的结果。如果没有任何方案,请返回0 。
解题思路:
此题主要是要搞清楚屏风放置方法与座位植物的数学关系。
假如座位和植物是这样摆的:’SSPPSPS‘,我们可以用列举法列出3种分隔方法;’SPSPSSPPSS‘,我们可以用列举法列出6种分隔方法;但当字符串过长,枚举法就不适用。我们观察到在第一种摆放方式中’SS‘和'SPS'之间有两个植物;第二种摆放方式中’,每两个座位之间分别有一个、两个植物,我们可以据此找到规律:
第一个‘两个座位’与第二个‘两个座位’之间有个植物,第二个‘两个座位’与第三个‘两个座位’有
个植物......第(n-1)‘两个座位’与第n个‘两个座位’之间有
个植物,那么分隔方案就可以表示为:
,问题就变得简单起来。
python源代码:
import numpy as np
def SP(corridor):
mod=7+10**9
s,p=0,0#
l=[]
for i in corridor:
if i=='s':
if(s>0 and s%2==0):
l.append(p+1)
p=0
s=s+1
if(s==2):
p=0
elif s>0 and s%2==0:
p=p+1
if (s%2==1 or s==0):
return 0
l.append(1)
p_list = np.array(l)
return np.cumprod(p_list)[-1]
corridor1='ppspsp'
corridor2='ssppsps'
corridor3='ssppspsppss'
corridor4='spp'
print('\'ppspsp\'分法:',SP(corridor1))
print('\'ssppsps\'分法:',SP(corridor2))
print('\'ssppspsppss\'分法:',SP(corridor3))
print('\'spp\'分法:',SP(corridor4))