想说的话
大家好,我是 @愿此后再无WA,可以叫我小A,也可以叫我愿愿,一位阳光帅小伙,对算法领域比较感兴趣。如果我的文章对您有用,欢迎持续关注,我们一起进步!
很抱歉各位,现离蓝桥杯比赛不到一个月时间,我临时改变了计划,转为全心备战蓝桥,因为这个省一对我来说太重要了,也是我最后一次机会,我一定要拿到手,那么这样的话我在博客上花的时间就会少了很多,也将导致博客文章质量明显下降,在此我给大家说声抱歉
这些日子我真的很开心,博客上能遇到一群志同道合的兄弟姐妹真的很幸福,没有你们的支持与鼓励我早就坚持不下去了,因为有你们我才能走的更远☀️☀️熬过这段时期我一定会回来的,爱你们❤️❤️
题意是从下往上走到顶点,哪个地方数字大就走哪边。但题目出的不够严谨,默认的意思是只能往正上一格走或者左斜上一格走,但没有说明。
对于地图,我们可以用一个二维列表存储。如果从下往上走的话需要考虑边界情况,如最下面一行的左边的4,它没有左斜上的格子,以及下面一行最右边的5它没有正上的格子。但如果从上往下的话就不用考虑边界了,如果从上往下走,走到最底层,要么是走下面一个格子,要么就是走右斜下的一个格子,而这些格子都必定存在的,因此我们可以从上往下走。
每走一步都选择金币多的走,不是简单的判断下面格子哪边金币多,而是判断从下面哪个格子走到最下面一层拿得多金币,谁多就选谁。当然每一步都是都是一个个相同的子结构。可以结合代码理解一下。最后就是剪枝了,因为很多点会重复经过,所以我们可以用一个字典这个位置的值存储起来,下次再走到这里的时候直接调用该值即可。
def dfs(a,b,deepth):
if deepth == N:
return nums[a][b]
if (a,b,deepth) not in used:
used[(a,b,deepth)] = max(dfs(a+1,b,deepth+1),\
dfs(a+1,b+1,deepth+1)) + nums[a][b]
return used[(a,b,deepth)]
used = {}
N = int(input())
nums = []
for i in range(N):
nums.append(tuple(map(int,input().split())))
print(dfs(0,0,1))