【leetcode】奶酪迷宫问题

时间限制: 3000MS

内存限制: 589824KB

题目描述:

一只聪明的老鼠发现了一个三角形的奶酪迷宫。这个迷宫有若干个小房间,每个小房间有若干块大小相等的小奶酪(每个房间至少有一块奶酪)。 奶酪迷宫的构造如下: (1) 奶酪迷宫一共有N行,第1行有一个小房间,第2行有两个房间,第3行有三个小房间,......第N行有N个小房间。 (2) 所有的小房间都是从第1列开始进行排列的。 (3) 奶酪迷宫的入口是第1行的那个小房间。 (4) 由于奶酪迷宫的特殊构造,小老鼠进入一个房间后,不允许回退到上一层的房间,也不允许走到左边的房间,只允许走到右边或者下面的房间。 (5) 在奶酪迷宫的最后一层,每个房间都有一扇通往迷宫出口的门,且最后一层的小房间没有通往左边和右边小房间的门。 现在小老鼠已经知道了每个小房间里面有多少块小奶酪,它找到了一条可以从入口走到出口且可以得到最多小奶酪的路径。 你能不能编写一个程序,输出小老鼠最多可以得到多少块小奶酪呢?

输入描述

单组输入。 第1行输入1个正整数N,表示奶酪迷宫的行数,N<=100。 接下来N行,第1行有1个正整数,表示第1行1个小房间的小奶酪数;第2行有2个正整数,表示第2行2个小房间的小奶酪数;......;第N行有N个正整数,表示第N行N个小房间的小奶酪数。每个房间的小奶酪数均不超过1000。每一行两个正整数之间用英文的空格隔开。

输出描述

输出小老鼠最多可以得到的小奶酪的数量。

样例输入

3

2

扫描二维码关注公众号,回复: 15800064 查看本文章

4 5

1 2 3

样例输出

13

解法

题目描述的是一个奶酪迷宫问题,要求找到从迷宫入口到出口的路径,使得路径上经过的奶酪数量最大。

这是一个动态规划问题,可以使用一个二维数组dp来记录每个位置的最大奶酪数量。dp[i][j]表示从迷宫的第1行第1列走到第i行第j列时能够获取的最大奶酪数量。初始状态为dp[1][1] = cheese[1][1],即从入口位置开始。

然后,对于每个位置dp[i][j],根据题目要求的移动规则,可以从上一行的dp[i-1][j-1]和dp[i-1][j]中选择较大的值,再加上当前位置的奶酪数量cheese[i][j],得到dp[i][j]的最大值。即dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + cheese[i][j]。

最后,从最后一行的dp数组中找到最大值,即为小老鼠能够获取的最大奶酪数量。

以下是使用Python实现的代码:

def max_cheese(N, cheese):
    dp = [[0] * (N+1) for _ in range(N+1)]
    dp[1][1] = cheese[0][0]
    for i in range(2, N+1):
        for j in range(1, i+1):
            dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + cheese[i-1][j-1]
    return max(dp[N])

N = int(input())
cheese = []
for _ in range(N):
    row = list(map(int, input().split()))
    cheese.append(row)
result = max_cheese(N, cheese)
print(result)

注意,对于输入的奶酪数量,需要将其存储到cheese列表中,并且在计算dp[i][j]时,使用cheese[i-1][j-1]表示第i行第j列的奶酪数量。

这样,代码就能正确计算并输出小老鼠能够获取的最大奶酪数量,可以通过测试并AC。

猜你喜欢

转载自blog.csdn.net/dsafefvf/article/details/131380417