Python编程输出数字三角形,Python数字三角形
标题描述
上图显示了一个数字三角形。从三角形的顶部到底部有许多不同的路径。
对于每条路径,您可以通过将路径上方的数字相加来获得总和。你的任务是找到最多
大和。
路径上的每一步只能从一个数字到下一级及其最近的左边数字或右边数字。
边上的数字。另外,向左下的次数和向右下的次数之差不能超过1。
[输入格式]
输入的第一行包含一个整数N (1 N 100),表示三角形中的行数。下面的
n线给出了一个数字三角形。三角形上的数字都是0到100之间的整数。
[输出格式]
输出代表答案的整数。
[样本输入]
五
七
3 8
8 1 0
2 7 4 4
4 5 2 6 5
[样本输出]
27
题目分析和解题思路
这是一个标准的动态规划问题。首先,我们用0完成完整的数组dp(如下所示),并将数据放入数组的相应下标中。然后,我们使用dp数组从上到下记忆路径上的值。最后在向左向右的次数不能超过1的条件下得到最大值。关键是我们不能局限于这个条件。我们只需要判断我们的值底部的下标和顶部的下标是否相差绝对值=1。
完成数组:在完成数组的过程中有一个规则,就是第一个数据是最上面的数据(这里以7为例),下标应该是N-1,所以这里的下标是4;其他数据下标是从前一层的每个下标1或-1获得的,例如下标1和-1分别为3和8。
Dp数组内存:在使用dp进行记忆时,我们不得不注意边界问题来分离它。比如当J(垂直)==0或者j==2*N-2的坐标时,我们要分别处理。
值:最后我们只需要把j的下标范围控制在[N-2,N]之间即可(两者都是闭区间)。
Python代码:
N=int(input()) # N的输入
L=[] #存储输入值
对于范围内的I(n):
长度append (list (map (int,input()。split ())) #输入数据值
Dp=[[0 for _ in range(2 * n-1)]for _ in range(n)]#构建一个DP数组
K=顶部数据的n-1 #下标
Res=[[k]] # res用于存储每个数据的下标。
对于范围内的I(n-1):
Q=[] #用于存储当前层的下标值
对于范围内的I(len(RES[-1]):
q.append(res[-1][i]-1)
q.append(res[-1][i] 1)
#分别-1 1上一层的每个下标值得到当前下标值并保存它。
Res.append(list(set(q))) #删除重复的下标
Dp[0][k]=l[0][0] #将顶部数据导入到对应的下标Dp数组中。
对于范围(1,n)中的I:#水平坐标
对于范围内的j(len(l[I]):
# l是存储的输入值,res是dp中值的下标,所以len(l)==len(res)
#边界处理res[i][j]是取出对应的下标,dp[i][res[i][j]]是当前值。
如果j==0:
DP[I][RES[I][j]]=DP[I-1][RES[I][j]1]l[I][j]
elif j0和j
DP[I][RES[I][j]]=max(DP[I-1][RES[I][j]-1),dp[i-1][res[i][j] 1]) l[i][j]
否则:
DP[I][RES[I][j]]=DP[I-1][RES[I][j]-1]l[I][j]
s=0
对于in range (k-1,k ^ 2):#获取值范围内的最大值。输出
如果s
印刷品
标签
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。