看到这个题之后第一想法是将表格转化为一个树(图?)结构,存储每个节点可以到达的下一节点的地址,然后用递归+贪心算最大值。同时注意到这题要求走两次,于是同时还要记录路径,走完一次后要清除这次路径上的数字。
开开心心(安安详详)写完代码之后一跑,发现小炸(其实过程中也犯了许多高水平(雾)的错误),动手模拟了一下才发现,两次递归是完全不够的(第三个点很好地考察了这一问题)。
不愧是普及+/提高,我这种快五年没碰信竞的咸鱼水平还是不够(想想六(七?)年前用的还是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)