D20-Acwing(一个月完成1刷)-DP与贪心代码实现

好啦~现在回来找bug了!

285没有上司的舞会

又对了一遍代码发现没错。
后来发现是这个原因

setrecursionlimit

‘在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常:RuntimeError: maximum recursion depth exceeded。

解决的方式是手工设置递归调用深度,方式为:
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万’

import sys
sys.setrecursionlimit(1000000)

N = 6010
hy = [0]*N
h,e,ne,idx = [-1]*N, [0]*N, [0]*N,0
f = [[0]*2 for _ in range(N)]
# 题中并未直接告诉我们谁是父节点,需要用这个数组去判断
# father[a]代表a有无父节点
father = [False]*N

def add(a,b):
    global idx
    idx += 1    
    e[idx] = b
    ne[idx] = h[a]
    h[a] = idx

    
def dfs(u):
    f[u][1] = hy[u]
    
    i = h[u]
    while i !=-1:
        j = e[i]
        dfs(j)
        
        f[u][0] += max(f[j][0],f[j][1])
        f[u][1] += f[j][0]
        i = ne[i]

n = int(input())
# 读入职员快乐指数
for i in range(1,1+n):
    hy[i] = int(input())

for _ in range(n-1):
    a,b = map(int,input().split())
    father[a] = True
    add(b,a)
# 从1号员工开始找整棵树的父节点,也就是没有父节点的那个节点
root = 1
while father[root]:
    root +=1
    
dfs(root)
print(max(f[root][0], f[root][1]))

901滑雪

虽然可以看懂代码,但是还是不懂,记忆化搜索到底指的是什么。

N = 310
f = [[-1]*N for _ in range(N)]
g = [[0]*N for _ in range(N)]

dx =[-1,0,1,0]
dy = [0,1,0,-1]

def dp(x,y):
    if f[x][y]!=-1:
        return f[x][y]
    f[x][y] = 1
    for i in range(4):
        a,b = x + dx[i],y+dy[i]
        if 1<=a<=n and 1<=b<=m and g[a][b]<g[x][y]:
            f[x][y] = max(f[x][y], dp(a,b) + 1)
    return f[x][y]
n,m = map(int,input().split())
for i in range(1,n+1):
    g[i] = [0] + list(map(int,input().split()))
res = 0
for i in range(1,n+1):
    for j in range(1,m+1):
        res = max(res, dp(i,j))
print(res)

记忆化搜索:空间换时间。在这是用f[x][y]的空间换取时间嘛???如果别人需要用的时候,就直接返回??

到贪心啦!!!

905区间选点

li =[]
n = int(input())
for _ in range(n):
    a,b = map(int,input().split())
    li.append((a,b))

li.sort(key = lambda x:x[1])

res = 0
idx = -2e9

for i in range(n):
    if li[i][0]>idx:
        res += 1
        idx = li[i][1]
print(res)

908最大不相交区间数量

li = []
n = int(input())
for _ in range(n):
    a,b = map(int,input().split())
    li.append((a,b))

li.sort(key = lambda x:x[1])
idx = -2e9
res = 0
for i in range(n):
    if li[i][0]>idx:
        res += 1
        idx = li[i][1]
print(res)

906区间分组

bash
import heapq

这题学习了一下heapq如何使用

包括heapfy\heappush\heapreplace

N = 100010
li = []
n = int(input())

for _ in range(n):
l,r =map(int,input().split())
li.append((l,r))
li.sort()

q = []

heapify(heap) 将heap属性强制应用到任意一个列表

heapq.heapify(q)
for i in range(n):
if (not q or q[0]>=li[i][0]):
heapq.heappush(q,li[i][1])
else:
heapq.heapreplace(q,li[i][1])
print(len(q))

148合并果子

为什么学的时候觉得和之前的那个合并石子很像呢
用堆好方便啊!

import heapq
n = int(input())
q = list(map(int,input().split()))

res = 0

heapq.heapify(q)
# 最后只剩下一个,就不用搬了~
while len(q)>1:
    a = heapq.heappop(q)
    b = heapq.heappop(q)
    res += a+b
    # 神奇的是,a+b会自己找位置叭~
    heapq.heappush(q,a+b)
print(res)```


## 913排队打水

```bash
n = int(input())
a = list(map(int,input().split()))

res = 0
a.sort()
for i in range(n):
    # 第i+1个人后面有n-i-1个人在等待
    res += a[i]*(n-i-1)
print(res)

104货仓选址

n = int(input())
li = list(map(int,input().split()))

li.sort()
res = 0

for i in range(n):
    res += abs(li[i]-li[n//2])
print(res)

125耍杂技的牛

N = 50010
f = []
n = int(input())
for _ in range(n):
    w,s = map(int,input().split())
    f.append((w,s))
# 第一次见这种key
f.sort(key = lambda x:x[0]+x[1])
sum = 0
res = -2e9
for i in range(n):
    w = f[i][0]
    s = f[i][1]
    res = max(res,sum - s)
    sum += w
print(res)

偶吼吼或或或或或或或或或或或或或或或或或或或
终于打卡完成啦!!!
不知不觉,在ACWING上打卡了73道题了,真的很棒!!!
要再开一篇文章进行复习啦~

从正式开始acwing算法基础课,到现在整整一个月啦~期间有过很emo的时刻,但是好在自己没放弃!还有一周就考蓝桥啦!!!无论结果如何,这一路上收获很多呀!希望自己可以再好好复习一下之前的代码,还不是很熟悉!加油!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值