字节1015算法笔试ak

第一题证明一下排序后最后位置最小就行,第二题用个defaultdict存就行,第三题check二分从最大最小开始搜不同的位置,然后每个候选x去判断就行。

其他都比较简单,就记录一下第四题吧

小红拿到了一个n阶正方形矩阵{aij},他准备从左上角走到右下角,每一步可以向右或向下走一格,向知道有多少种不同路径满足路径元素和恰好为x。

0<x,aij<10^9

1<n<18

注解:dp肯定能想到,首先必须用稀疏方式存储路径值,不然开三维数组内存爆炸时间太长。其次如果不剪枝只能过一半,剪枝两种方法,一种如果当前值已经超了,就不计算路径数量了;另一种计算当前位置到终点的最大路径,如果当前值加上最大路径还是不够,直接剪掉。

from collections import defaultdict
n,x = map(int,input().split())
mat = []
for i in range(n):
    mat.append(list(map(int,input().split())))
dp = [[defaultdict(int) for _ in range(n)] for __ in range(n)]
dp[0][0][mat[0][0]] = 1
leng = [[0 for _ in range(n)] for __ in range(n)]
leng[-1][-1] = mat[-1][-1]
for i in range(n-1,-1,-1):
    for j in range(n-1,-1,-1):
        if i == n - 1 and j == n - 1:
            continue
        if i == n - 1:
            leng[i][j] = leng[i][j+1] + mat[i][j]
        elif j == n - 1:
            leng[i][j] = leng[i+1][j] + mat[i][j]
        else:
            leng[i][j] = max(leng[i][j+1],leng[i+1][j]) + mat[i][j]
for i in range(n):
    for j in range(n):
        if i > 0:
            for key,value in dp[i-1][j].items():
                if key + mat[i][j] > x or key + leng[i][j] < x:
                    continue
                dp[i][j][key + mat[i][j]] += value
        if j > 0:
            for key,value in dp[i][j-1].items():
                if key + mat[i][j] > x or key + leng[i][j] < x:
                    continue
                dp[i][j][key + mat[i][j]] += value
print(dp[-1][-1][x])

全部评论
这些思路是怎么想到的呀,是做过类似的吗
点赞 回复 分享
发布于 2023-10-15 21:02 四川

相关推荐

仁者伍敌:实习生要工作经验,工作要实习经验
点赞 评论 收藏
分享
07-07 12:25
门头沟学院 Java
程序员牛肉:你这个智邮公司做的就是那个乐山市税务系统的服务吗?
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 11:15
点赞 评论 收藏
分享
评论
6
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务