变菜,回归,然后被薄纱
查看原帖
变菜,回归,然后被薄纱
34341
Wu_hRay楼主2023/10/17 12:34

看到这个题之后第一想法是将表格转化为一个树(图?)结构,存储每个节点可以到达的下一节点的地址,然后用递归+贪心算最大值。同时注意到这题要求走两次,于是同时还要记录路径,走完一次后要清除这次路径上的数字。

开开心心(安安详详)写完代码之后一跑,发现小炸(其实过程中也犯了许多高水平(雾)的错误),动手模拟了一下才发现,两次递归是完全不够的(第三个点很好地考察了这一问题)。

不愧是普及+/提高,我这种快五年没碰信竞的咸鱼水平还是不够(想想六(七?)年前用的还是Pascal呢hhh,信竞两年高考三年让我掌握了四种编程语言qaq)。

下附错误代码,学过高考之后写其他语言的水平下降不少,python倒是十分熟练(害)。

我自己看自己的代码都觉得多少有点暴力,也是希望佬们帮忙优化一哈qwq

def sum_max(k):
    global re
    global re_road
    if re[k]!=-1:
        return re[k]
    if len(lin[k])==0:
        re[k]=num[k][2]
        re_road[k].append(k)
        return re[k]
    l=[sum_max(i) for i in lin[k]]
    m_k=max(l)
    re[k]=num[k][2]+m_k
    re_road[k]=[k]+re_road[lin[k][l.index(m_k)]]
    return re[k]

N=int(input())

num=[]
A=list(map(int,input().split()))
while A!=[0,0,0]:
    num.append(A)
    A=list(map(int,input().split()))

lin=[[]for i in range(len(num))]
for i in range(len(num)):
    for j in range(len(num)):
        if i==j:
            continue
        if num[i][0]<=num[j][0] and num[i][1]<=num[j][1]:
            lin[i].append(j)

re=[-1 for i in range(len(num))]
re_road=[[]for i in range(len(num))]
round_=[sum_max(i) for i in range(len(num))]
m_1=max(round_)

for i in re_road[round_.index(m_1)]:
    num[i][2]=0

re=[-1 for i in range(len(num))]
re_road=[[]for i in range(len(num))]
round_=[sum_max(i) for i in range(len(num))]
m_2=max(round_)

print(m_1+m_2)
2023/10/17 12:34
加载中...