T1 直接模拟,奇数的话,讨论一下最中间那个只能是xszo之间一个,然后把两边拆成两份,按位置比较,为了比较方便,可以写一个映射函数比较
def fc(c):
if c in ['o', 'x', 's', 'z']:
return c
if c == 'd':
return 'p'
if c == 'p':
return 'd'
if c == 'b':
return 'q'
if c == 'q':
return 'b'
if c == 'n':
return 'u'
if c == 'u':
return 'n'
return 'A'
def solve():
s = input()
n = len(s)
t1, t2 = "", ""
if n % 2 == 1:
c = s[n // 2]
if c not in ['o', 'x', 's', 'z']:
print("no")
return
for i in range(n):
if i < n // 2:
t1 += s[i]
if i > n // 2:
t2 += s[i]
else:
for i in range(n):
if i < n // 2:
t1 += s[i]
if i >= n // 2:
t2 += s[i]
t2 = t2[::-1]
m = len(t1)
for i in range(m):
if fc(t1[i]) != t2[i]:
print("no")
return
print("yes")
q = int(input())
while q > 0:
solve()
q -= 1
T2 动态规划,dp[i][j]记录状态 然后往四个方向转移即可,Python3会TLE,pypy3能过
import sys
input = sys.stdin.readline
n = int(input())
grid = [list(map(int, input().split())) for _ in range(n)]
dp = [[-10 ** 18] * n for _ in range(n)]
dp[0][0] = grid[0][0]
for j in range(n):
for i in range(n):
for dx, dy in ((i + 2, j - 1), (i - 2, j - 1), (i - 1, j - 2), (i + 1, j - 2)):
if 0 <= dx < n and 0 <= dy < n:
dp[i][j] = max(dp[i][j], grid[i][j] + dp[dx][dy])
print(max(dp[i][-1] for i in range(n)))
T3 对单独的一段连续0,记录l为长度,共有2^(l-1)种取法(开头和结尾段无论怎样都只有1种取法) 最后算总排列数为0的个数的阶乘除去每一段0的个数的阶乘
import sys
input = sys.stdin.readline
n = int(input())
s = list(input().strip())
stack = [[s[0],1]]
for i in range(1,n):
if s[i] == stack[-1][0]:
stack[-1][1] += 1
else:
stack.append([s[i],1])
Mod = 10 ** 9+ 7
Mx = 10**5 + 1
p = [1] * Mx
for i in range(1,Mx):
p[i] = p[i - 1] * i % Mod
zero_count = 0
ans = 1
for i in range(len(stack)):
if stack[i][0] == "0":
zero_count += stack[i][1]
ans *= pow(p[stack[i][1]],Mod - 2,Mod)
if i != 0 and i != len(stack) - 1:
ans *= pow(2,stack[i][1] - 1,Mod)
ans %= Mod
print(ans * p[zero_count] % Mod)
#阿里##笔试##python#