蓝桥杯历届试题 数字三角形【第十一届】【省赛】【C组】python

原本用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 数字三角形

wowon~数字三角形

在这里插入图片描述
思路

  1. 定义一个二维数组f[i][j] f[1][1]=data_list[0][0] 其余值初值都给0 。从第二行开始计算
  2. 计算转移方程 f[i][j]=data_list[i-1][j-1]+max(f[i-1][j],f[i-1][j-1])
  3. 最后全部计算完。
  4. 之后判断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])

在这里插入图片描述

欢迎交流,共同进步

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值