赞
踩
给一个给定括号序列,给该括号上色,上色有三个要求
1、只有三种上色方案,不上色,上红色,上蓝色
2、每对括号必须只能给其中的一个上色
3、相邻的两个不能上同色,可以都不上色
求0-len-1这一区间内有多少种上色方案,很明显的区间DP
dp[l][r][i][j]表示l-r区间两端颜色分别是i,j的方案数
0代表不上色,1代表上红色,2代表上蓝色
对于l-r区间,有3种情况
1、if(l+1==r) 说明就只有一对,那么
dp[l][r][0][1]=1;
dp[l][r][1][0]=1;
dp[l][r][0][2]=1;
dp[l][r][2][0]=1;
2、if(l与r是配对的)
递归(l+1,r-1)
状态转移
dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod;
dp[l][r][1][0]=(dp[l][r][1][0]+dp[l+1][r-1][i][j])%mod;
dp[l][r][0][2]=(dp[l][r][0][2]+dp[l+1][r-1][i][j])%mod;
dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod;
3、if(l与r不配对)
dp[l][r][i][j]=(dp[l][r][i][j]+(dp[l][p][i][k]*dp[p+1][r][q][j])%mod)%mod;
import sys s=input() num=strlen=len(s) tmp=[0 for i in range(num)] #记录左括号的位置 match=[0 for i in range(num)] #记录右匹配的位置 dp=[[[[0 for i in range(3)]for i in range(3)]for i in range(num)]for i in range(num)] # 由内向外建立多维dp 数组的形式 # dp=np.arange(3*3*num*num).reshape(num,num,3,3) mod=1000000007 def getmatch(len) : p=0 for i in range(len): if(s[i]=='(') : tmp[p]=i p=p+1 else: match[i]=tmp[p-1] match[tmp[p-1]]=i p=p-1 def dfs(l, r): if (l+1==r): #边界条件 dp[l][r][0][1]=1 dp[l][r][1][0]=1 dp[l][r][0][2]=1 dp[l][r][2][0]=1 return if(match[l]==r): #如果匹配的话方案数相加 dfs(l+1,r-1) for i in range(3): for j in range(3): if(j!=1): dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod; if(i!=1): dp[l][r][1][0]=(dp[l][r][1][0]+dp[l+1][r-1][i][j])%mod; if(j!=2): dp[l][r][0][2]=(dp[l][r][0][2]+dp[l+1][r-1][i][j])%mod; if(i!=2): dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod; return else: #否则方案数相乘,乘法原理 p=match[l] dfs(l,p) dfs(p+1,r) for i in range(3): for j in range(3): for k in range(3): for q in range(3): if not((k==1 and q==1) or (k==2 and q==2)): dp[l][r][i][j]=(dp[l][r][i][j]+(dp[l][p][i][k]*dp[p+1][r][q][j])%mod)%mod if __name__=='__main__': getmatch(strlen) dfs(0,strlen-1) ans=0 for i in range(3): for j in range(3): ans=(ans+dp[0][strlen-1][i][j])%mod; sys.stdout.write(str(ans))
#coding=utf-8
import numpy as np
#1
image =[[(col+1)*(row+1) for col in range(5)] for row in range(3)]
a = np.array(image)
print(a)
#2
new_image =np.zeros((3,5))
#3
b = np.arange(12).reshape(3,4)
print(b)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。