蓝桥杯 算法提高VIP-夺宝奇兵 python dfs动归

想说的话

大家好,我是 @愿此后再无WA,可以叫我小A,也可以叫我愿愿,一位阳光帅小伙,对算法领域比较感兴趣。如果我的文章对您有用,欢迎持续关注,我们一起进步!

很抱歉各位,现离蓝桥杯比赛不到一个月时间,我临时改变了计划,转为全心备战蓝桥,因为这个省一对我来说太重要了,也是我最后一次机会,我一定要拿到手,那么这样的话我在博客上花的时间就会少了很多,也将导致博客文章质量明显下降,在此我给大家说声抱歉


这些日子我真的很开心,博客上能遇到一群志同道合的兄弟姐妹真的很幸福,没有你们的支持与鼓励我早就坚持不下去了,因为有你们我才能走的更远☀️☀️熬过这段时期我一定会回来的,爱你们❤️❤️

夺宝奇兵

蓝桥杯 算法提高VIP-夺宝奇兵 python dfs动归_第1张图片
蓝桥杯 算法提高VIP-夺宝奇兵 python dfs动归_第2张图片

思路

题意是从下往上走到顶点,哪个地方数字大就走哪边。但题目出的不够严谨,默认的意思是只能往正上一格走或者左斜上一格走,但没有说明。

对于地图,我们可以用一个二维列表存储。如果从下往上走的话需要考虑边界情况,如最下面一行的左边的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))

你可能感兴趣的:(刷题,蓝桥杯,算法)