每日两题 -day113

这篇博客介绍了两种算法问题的解决方案。第一部分讲解了如何利用BFS(广度优先搜索)解决带有无消耗转移点的迷宫寻路问题,通过构建转移点列表和队列实现最短路径查找。第二部分则讨论了安装Shopee广告牌的问题,采用动态规划判断集合是否能被二分,并计算符合条件的子集最大长度。涉及的算法包括路径搜索和子集划分策略。
摘要由CSDN通过智能技术生成

今天 的每日两题就总结下午打的一个比赛的两个题

Shopee Xpress Delivery

请添加图片描述
请添加图片描述

迷宫寻找最短路问题, 而且在地图添加了无消耗转移点

使用BFS解决, 首先构建 转移点列表, 从 0,0 点开始 ,可移动方向是上,下,左,右 和同类型的转移点的位置,

对于可移动的点,判断是否被访问过,将其添加到队列中,若 终点被添加 那么返回路径值

import collections
m,n =  [int(num) for num in input().strip().split()]
gird =[]
dic = [[]for _ in range(260)]

for i in range(m):
    nums= []
    for num in input().strip().split():
        num = int(num)
        nums.append(num)
        if num!= 0:
            dic[num].append((i,len(nums)-1))
    gird.append(nums)

vist = [[0]*n for _ in range(m)]
vist[0][0]=1
# print(gird)
# print(dic)
que=collections.deque([[0,0,0]])

while que:
    x,y,w = que.popleft()
    if x==m-1 and y ==n-1:
        print(w)
        break
    for nx,ny in [[x+1,y],[x-1,y],[x,y+1],[x,y-1]]:
        if 0<=nx<m and 0<=ny<n and vist[nx][ny]==0:
            que.append([nx,ny,w+1])
            vist[nx][ny]=1
    for nx,ny in dic[gird[x][y]] :
        if  vist[nx][ny]==0:
            que.append([nx,ny,w])
            vist[nx][ny]=1

Installation of a Shopee Billboard

请添加图片描述

参考416. 分割等和子集 使用动态规划来判断一个集合是否可以被二分, 然后使用组合数来取原列表的组合,然后判断该子集能否被二分


from itertools import combinations
n = int(input())
nums= [int(num) for num in input().split()]
if n < 2:
    print(0)
 
flag = 0
res = 0
for i in range(n,1,-1):
    liss = list(combinations(range(0,n), i))
    for lis in liss:
        tmp =[]
        for i in lis :
            tmp.append(nums[i])
        total = sum(tmp)
        if total % 2 != 0:
            continue
        target = total // 2
        if target >=res:
            dp = [True] + [False] * target
            for i, num in enumerate(tmp):
                for j in range(target, num - 1, -1):
                    dp[j] |= dp[j - num]
            if dp[target]:
                res = max(res,target)
                flag =1 
                # break
print(res)

   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值