来了来了!AC了!
之前还没觉得自己“分离读取步骤与处理步骤”有什么问题,今天试了一下就不卡时间了!
其实本质上是由于“每当读入一次就填满一整行dp[i]”的方式,使得:
1. 不需要存储大部分数据:穿过走廊的时间、每个dp[i][j]是否访问过、走廊之间的树形关系等等(虽然并没有卡空间);
2. 不需要在处理数据时分情况讨论——在填入第i个走廊的一整行dp[i]时,两个子走廊dp[a]和dp[b]一定是填满的(节约时间)
3. 不需要多次递归调用dfs函数——该函数的调用次数应当等于走廊数。我的上n版代码都在反复调用该函数,(当时间上限=6000时)dfs函数调用次数从9位数降低到6位数(虽然还是TLE)
相比之下,我的旧版本代码最大的问题在于,每次调用dfs都单独对二维数组dp中的一格进行处理,且在后续调用时用记忆搜索的方式进行处理。记忆搜索快那么一点,但是在本题解法中还不够快(见上文原因2)
总结:关于缩短动规时间,在dp数组里,每一次填尽可能多的信息,并且尽可能少地重复填写/调用。