原本用BFS 结果只得了四十分
问题描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入格式
输入的第一行包含一个整数 N,表示三角形的行数。下面的N行给出数字三角形。数字三角形上的数都是0至100之间的整数。
输出格式
输出一个整数,表示答案。
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Data
样例输出
27
版本1:BFS
用BFS搜索所有情况。运行超时;
def zuoxia(old_list):
return [old_list[0]+1,old_list[1],old_list[2]+1,old_list[3]+data[old_list[0]+1][old_list[1]],old_list[4]+1]
def youxia(old_list):
return [old_list[0]+1,old_list[1]+1,old_list[2]+1,old_list[3]+data[old_list[0]+1][old_list[1]+1],old_list[4]-1]
def judge(x):#判断节点是否合法
if x[4]>1 or x[4]<-1 :
return False
else:
return True
n=int(input())
data=[]
for i in range(n):
media=list(map(int,input().split()))
data.append(media)
#data=[[7],[3,8],[8,1,0],[2,7,4,4],[4,5,2,6,5]]
queue=[[0,0,0,data[0][0],0]] #刚开始在坐标xi yi 步骤(层次,比如1层只能向下走,4的时候不再操作,将数据弹出存入ouput)是0 ,路径之和是7, 向左下走+1 右xia-1 最后这个值>1 和<-1都会被舍弃
output=[]
def bfs():
global queue
global output
while queue:
old=queue.pop(0)
if old[2]>=(n-1): #说明到底了
if judge(old)==True: #判断节点是否合法
output.append(old) #将这个数据存到output 中
continue
else:
new=zuoxia(old)
queue.append(new)
new=youxia(old)
queue.append(new)
bfs()
a=sorted(output,key=lambda x: x[3])
print(a[-1][3])
版本二:
参考了二位同学的文章
lilesien 数字三角形
思路
- 定义一个二维数组f[i][j] f[1][1]=data_list[0][0] 其余值初值都给0 。从第二行开始计算
- 计算转移方程 f[i][j]=data_list[i-1][j-1]+max(f[i-1][j],f[i-1][j-1])
- 最后全部计算完。
- 之后判断n是奇数偶数,如果是奇数输出f最后一行的中间的那个数字,如果是偶数输出f最后一行的中间两个数的最大值
n=int(input())
data_list=[]
for i in range(n):
media=list(map(int,input().split()))
data_list.append(media)
#以上是数据的输入
f=[[0 for i in range(n+1)]for i in range(n+1)]
f[1][1]=data_list[0][0]
for i in range(2,n+1):
for j in range(1,i+1):
f[i][j]=data_list[i-1][j-1]+max(f[i-1][j],f[i-1][j-1])
if n%2 == 0 : #说明是偶数:
print(max(f[n][n//2+1],f[n][n//2]))
else:
print(f[n][n//2+1])
欢迎交流,共同进步