本关任务:在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字的乘积最小,路径上的每一步都只能往左下或右下走,只需求出最小的乘积,不需要给出具体路径。 2 3 8 1 2 2 4 7 1 4 8 5 2 6 5输入的第一行为数字三角形的层数,后面为数字三角形。
n = eval(input()) A=[] for i in range(n): X = A.append(list(map(int, input().split()))) def MinRouteProd(i,j): ########## begin ########## # 请在此填写代码,返回以i,j为顶点的最小路径积 if i==n-1: return A[i][j] return A[i][j]*min(MinRouteProd(i+1,j),MinRouteProd(i+1,j+1)) ########## end ########## return result print(MinRouteProd(0,0))第2关:最大子序列积
本关任务:对于一个浮点数序列A,只包含正数,找到一个子序列,使得该子序列中元素的乘积是最大的;输出这个最大的乘积。
输入的第一行是序列的元素总数,第二行是以空格隔开的浮点数序列; 输出的数据精确到小数点后2位,不足的位补0
根据提示,在右侧编辑器补充代码,计算并输出最大子序列的乘积。
n = eval(input()) A= list(map(float, input().split())) #求A[low..high]中跨越mid的最大子序列积 def FindMaxCrossing(A,low,mid,high): ########## begin ########## leftSum=-1e50 sum0=1 for i in range(mid,low-1,-1): sum0*=A[i] leftSum=max(leftSum,sum0) rightSum=-1e50 sum0=1 for i in range(mid+1,high+1): sum0*=A[i] rightSum=max(rightSum,sum0) return leftSum*rightSum ########## end ########## #求A[low..high]中的最大子序列积 def FidMax(A,low,high): ########## begin ########## # 请在此填写代码,返回区间[low,high]的最大子序列积 if low==high: return A[low] mid=(low+high)//2 leftSum=FidMax(A,low,mid) rightSum=FidMax(A,mid+1,high) crossSum=FindMaxCrossing(A,low,mid,high) return max(leftSum,rightSum,crossSum) ########## end ########## result = FidMax(A,0,len(A)-1) print('%.2f' % result)
求求三连啦。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)