AcWing题目AcWing 5165. CCC单词搜索 + AcWing 5166. 对称山脉

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下标的处理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值