AcWing 5165. CCC单词搜索
该题是典型的DFS题目,通过设定旋转方向,实现对单词的搜索
str = input()
r = int(input())
c = int(input())
l = len(str)
array = []
ans = int(0)
dx = [-1, -1, 0, 1, 1, 1, 0, -1]
dy = [0, 1, 1, 1, 0, -1, -1, -1]
def dfs(x, y, d, u, cnt) :
global ans
if x < 0 or x >= r or y < 0 or y >= c or array[x][y] != str[u] :
return
if u == l - 1 :
ans += 1
else :
dfs(x + dx[d], y + dy[d], d, u + 1, cnt)
if u > 0 and cnt == 0 :
for i in range(2) :
dfs(x, y, d ^ 2 ^ (i << 2), u, cnt + 1)
for i in range(r) :
line = input()
line_list = line.split()
array.append(line_list)
for i in range(r) :
for j in range(c) :
for d in range(8) :
dfs(i, j, d, int(0), 0)
print(ans)
插入列表的元素可以是列表,依次构建二维列表,实现字母数组的输入;
比较重要的是方向旋转的处理,
dfs(x, y, d, u, cnt) : 中,d用于记录旋转的方向,cnt用于记录旋转的次数,
将八个方向从0到7进行表示,用二进制则表示为000到111
本题中,方向只能旋转90度,即方向相差两位旋转,此时使用了d ^ 2 ^ (i << 2) 的运算方式,可做积累,应用于之后相似的题目。
AcWing 5166. 对称山脉
本题如果通过枚举处理,则会出现时间超限的问题,而又不满足使用二分的条件,即需要将每个数据相加并判断当前数字的大小
但在计算的过程中,可以发现做了大量的相同运算,比如长度2的数组A,在以A为中心的,长度4的数组B中,重复计算了2,因此可以简化计算过程,从而降低时间复杂度
import sys
maxnum = sys.maxsize
n = int(input())
numbers = input()
number_list = numbers.split()
num = [int(element) for element in number_list]
ans = [maxnum] * 5010
for i in range(n) :
l = i
r = i
s = 0
while l >= 0 and r < n :
s += abs(num[l] - num[r])
l -= 1
r += 1
ans[(r - 1) - (l + 1) + 1] = min(s, ans[(r - 1) - (l + 1) + 1])
for i in range(n) :
l = i
r = i + 1
s = 0
while l >= 0 and r < n:
s += abs(num[l] - num[r])
l -= 1
r += 1
ans[(r - 1) - (l + 1) + 1] = min(s, ans[(r - 1) - (l + 1) + 1])
for i in range(1, n + 1) :
print(ans[i], end=' ')
其中比较麻烦的是,python下标的处理