牛客刷题合集-动态规划系列(一)

数据结构与算法刷题实战:从基础到面试的深度掌握路径 数据结构与算法是计算机科学的核心基础,其本质是训练将复杂问题转化为可计算模型的思维方法。理解常见数据结构(如数组、链表、树、图)和算法思想(如分治、动态规划、贪心)的原理,是构建高效、可靠软件系统的基石。掌握这些技术不仅能优化程序性能,更是通过大厂技术面试、解决实际工程难题的关键能力。在面试准备和技能提升中,系统化的刷题训练,特别是结合《剑指Offer》、《程序员代码面试指南》等经典题库进行“学习-遗忘-重实现”的深度循环,能有效对抗遗忘曲线,将知识内化为稳固的解题能力。本文分享的实战档案,正是基于这一理念 阅读详情

开个帖子把动态规划的模板题先写了

合集地址:牛客动态规划模版题


6 月 7 日

完全背包

代码

说下思路吧

这里我们定义一个一维的 dp 数组,长度为 V + 1(V是体积)

dp[j] 就代表背包体积 j 所能容纳的最大物品价值总和

对于每个物品 i,我们只有加或者不加两种操作:

  • 加,那么就是 dp[ j - v[ i ] ] + w[ i ]
  • 不加,那么就是 dp[ j ]

(1)求至多能装多大?

这个只管装就是了,那么我们外层循环遍历体积,内层循环遍历物品

( PS:外层循环遍历物品,内层循环遍历体积也行)

如何理解呢?

其实就是可以看作是,我们对于每个 j 体积的背包,都会去遍历所有的物品,看能不能多装一点,而且这也利用到了物品数量不限制的条件

举个例子:

我背包体积为 8,有体积为 6,4,2的三个物品,为了简化,不讨论物品的价值,毕竟价值就是一个取 max 的处理;

-> 当 v 从 0,1,……,8 依次考虑时候,当 v = 4 的时候,也就是计算 dp [4]:

  • 我们逐个遍历物品,6 放不下,4 刚好放下,那么就是 dp[4] = dp[4 - v[ i ]] + w[i],这里 物品 i 指的就是体积为 4 的这个物品;
  • 接着我们遍历物品三,dp[4] = dp[4 - v[i]] + w[i] = dp[4 - 2] + w[ i ] = dp[2] + w[i]
  • dp[2]已经计算过了,也就是说体积为 4 的背包有两种方案:1️⃣ 4  、 2️⃣ 2 + 2

所以这就是为什么说 外层循环遍历体积,内层循环遍历物品,可以利用到物品数量不限制的条件,这也就是完全背包和 01 背包不一样的地方。

至于外层循环遍历物品,内层循环遍历体积,可以这么理解:

  • 当只有物品一这种规格的时候,我装体积 V 的背包,可以算出来装多少;
  • 然后物品增加到有两样物品的时候(我已经有了物品一能装出来的最大价值),那么考虑放入物品 2 会不会增加装的价值;
  • 以此类推,我们有 3 种、 4 种、 5 种……物品规格的时候

(2) 体积为 V,求恰好能装多大?

这里有个不一样的就是,比如背包体积为 8,仍然是有体积为 6,4,2的三个物品:

题一中,dp[5]是有值的,也就是之前两种方案的最大值;

而在本问中,dp[5]是为 0 的,因为这三种物品,你是凑不到体积刚好为 5 的,那么怎么把这个约束加进去呢?

我觉得这个处理逻辑可以好好思考写一下!



# 最多装多少价值
def getMaxW1(arrV, arrW, V):
    
    # 定义 dp 数组,dp[j]表示体积j 情况下容量的最大价值
    dp =[0] + [0] * V
    for i in range(len(arrV)):
        for j in range(arrV[i], V + 1):
            # 当前物品装或者不装的最大值
            dp[j] = max(dp[j - arrV[i]] + arrW[i], dp[j])
    return dp[V]

    
    
# 恰好装满时是多少价值 
def getMaxW2(arrV, arrW, V):
    # 定义 dp 数组,dp[j]表示体积j 情况下容量的最大价值
    dp =[0] + [0] * V
    for j in range(V + 1):
        for i in range(len(arrV)):
            # 当前物品装或者不装的最大值
            if j >= arrV[i]:
                if j - arrV[i] == 0 or dp[j - arrV[i]] != 0:
                    dp[j] = max(dp[j - arrV[i]] + arrW[i], dp[j])
                # 下面的不要
                # else:
                #     dp[j] = dp[j]
            # print(dp)
    return dp[V]


if __name__ == "__main__":
    n, V = map(int, input().split())
    arrW = [] 
    arrV = []
    for _ in range(n):
        v, w = map(int, input().split())
        arrV.append(v)
        arrW.append(w)
    
    print(getMaxW1(arrV,arrW,V))
    print(getMaxW2(arrV,arrW,V))
    

(PS:虽然之前在 leetcode 上写过,但是写第二问的时候,还是出了好多错,debug 了挺久的,还是不熟练啊,愈发觉得自己菜😭)


6 月 8 日

01 背包:题目地址

代码

# 老流畅,ACM 模式处理输入
n, V = map(int, input().split())

vList = []
wList = []
for _ in range(n):
    vi, wi = map(int, input().split())
    vList.append(vi)
    wList.append(wi)

# 第一问
def getMax1(vList, wList, V):
    dp = [0] + [0] * V
    
    for i in range(len(vList)):
        for j in range(V, vList[i] - 1, -1):
            dp[j] = max(dp[j - vList[i]] + wList[i], dp[j])
            
    return dp[V]


# 第二问
def getMax2(vList, wList, V):
    dp = [0] + [float('-inf')] * V
    
    for i in range(len(vList)):
        for j in range(V, vList[i] - 1, -1):
            dp[j] = max(dp[j - vList[i]] + wList[i], dp[j])

    return dp[V] if dp[V] != float('-inf') else 0


print(getMax1(vList, wList, V))
print(getMax2(vList, wList, V))
    
    
    
    
  • 第一问

没什么好说的,主要就是要体积要倒序遍历,不然会存在物品复用(因为这里说了每个物品只有一件)

  • 第二问

给我整的有点懵,直接倒序有问题,一开始没想出该做哪里的修改;

  • 一开始也是倒序,然后发现不知道恰好体现在哪里,然后开始定义dp[ j ],表示背包还剩体积 j所恰好装的,然后返回判断 dp[0],最后也没做出来

(PS:估计这里定义的还是还剩体积 j所能装的最大容量而不是恰好)

  • 最后其实还是要改个初始化的值,这样就可以判断恰好,因为这相当于是强制从 体积为 0 开始装起(如果全部初始化为 0,那么就相当于可以从任意位置开始装,就意味着会有些位置是空,即没装满)

6月 9 日

二维差分

代码

第一次提交过了 88.3%,超时了也是在意料之中吧,毕竟纯暴力

💡PS:先写一维差分再去写二维差分可能更好理解一点

def updated_grid(x1, y1, x2, y2, k, grid):
    i= x1 - 1
    while i < x2:
        j = y1 - 1
        while j < y2:
            grid[i][j] += k
            j += 1
        i += 1
#     print(grid)
    return grid
    

if __name__ == '__main__':
    # 1. input
    n, m, q = map(int, input().split())
    grid = []
    for _ in range(n):
        grid.append(list(map(int, input().split())))

    for i in range(q):
        x1, y1, x2, y2, k = map(int, input().split())

        # 2. updated grid
        grid = updated_grid(x1, y1, x2, y2, k, grid)
        
    # 3. print result
    for i in range(n):
        for j in range(m):
            if j != m - 1:
                print(f"{grid[i][j]} ", end="")
            else:
                print(grid[i][j])
  

第一次二维差分 DP,但是看起来怎么这么抽象呢?晚点再写吧,累了


6 月 12 日

前几天在搞博客,写了一个定时 tracking  diffusion paper 然后更新的主页的自动化流程,

所以没定时打卡……

二维前缀和

代码

备注这个数据读写时间注意,没考虑太懂怎么注意⚠️

先硬写一版代码(一次性过了)

n, m, q = map(int, input().split())
nums = []
# 输入
for _ in range(n):
    nums.append(list(map(int, input().split())))

"""
定义前缀和数组:
prefixSum[i][j], 代表以 [i][j]为右下角,[0][0]为左上角的数组和的值
"""
prefixSum = [[0] * (m + 1) for _ in range(n + 1)]

for i in range(1, n + 1):
    for j in range(1, m + 1):
        prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + nums[i - 1][j - 1]
        

for _ in range(q):
    x1, y1, x2, y2 = map(int, input().split())
    ans = prefixSum[x2][y2] - prefixSum[x2][y1 - 1] - prefixSum[x1 - 1][y2] + prefixSum[x1 - 1][y1 - 1]
    print(ans)
    

先写一维差分再去写二维差分可能更好理解一点

差分

代码

不会写的看看这个博客:每周一算法:差分算法-优快云博客

然后从左往右边开始累计加和,就出来结果了

n, m = map(int, input().split())

nums = list(map(int, input().split()))

# 最后加一个 0 是为了防止溢出
diffnums = [0] * len(nums) + [0]

for _ in range(m):
    l, r, k = map(int, input().split())
    diffnums[l - 1] += k
    diffnums[r] -= k

for i in range(1, n + 1):
    diffnums[i] += diffnums[i - 1]

for i in range(n):
    nums[i] += diffnums[i]

print(' '.join(map(str,nums)))

6 月 18 日

前缀和


代码

n, q = map(int, input().split())

nums = list(map(int, input().split()))
nums = [0] + nums
for i in range(1, len(nums)):
    nums[i] += nums[i - 1]
for _ in range(q):
    l, r = map(int, input().split())
    print(nums[r] - nums[l - 1])


yolov26改进 | Neck篇 | 利用Gold-YOLO改进yolov26对小目标检测能力(全网独家首发) 本文介绍利用Gold-YOLO的Neck改进YOLOv26,通过信息聚集—分发机制GD,先全局汇聚不同层级特征,再将融合后的全局信息重新注入各尺度分支,增强浅层细节与深层语义之间的交互,减少传统Neck逐层传递造成的信息损失。该结构虽然融合路径更长,但能够在不过度增加延迟的前提下提升多尺度目标检测能力,尤其适合大小目标并存、尺度变化明显和复杂背景场景。本文将讲解GD机制、Neck替换、模块注册与配置方法,并提供完整代码、配置文件及Codex修改思路,方便直接复现、实验对比和二次创新。 阅读详情

相关推荐

Allegro基本规则设置指导书之Spacing Region

当网络需要在Region中需要按照自身的规则匹配时,可以创建Region Class来匹配。Region也支持Class to Class规则,点击ok即可。Allegro基本规则设置指导书之Spacing Region。下面介绍基本规则设置指导书之Spacing Region。给创建好的Region 匹配一个规则。空白的地方创建一个Region。

weixin_54787054的博客 564

牛客网算法学习笔记-动态规划(2)

经典的动态规划问题

jq117的博客 572

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4560

牛客NC68 跳台阶【简单 动态规划 C++/Java/Go/PHP】

【代码】牛客NC68 跳台阶【简单 动态规划 C++/Java/Go/PHP】

weixin_37991016的博客 663

使用 Simulink + Simscape Electrical 实现一个三相电压型PWM整流器的仿真模型

三相电压型PWM整流器(Voltage Source PWM Rectifier, VSR)是一种先进的电力电子装置,它不仅可以将交流电转换为直流电,还能实现单位功率因数操作,即输入电流与输入电压同相位。这不仅提高了电网质量,减少了谐波污染,而且提高了整个系统的效率。本文将详细介绍如何使用实现一个三相电压型PWM整流器的仿真模型,并探讨其在单位功率因数下的控制策略和仿真结果。本文详细介绍了如何使用搭建一个三相电压型PWM整流器的仿真模型,并对其在单位功率因数下的控制策略进行了探讨。

amy_mhd的博客 128

基于YOLOv11的手术器械计数系统:从数据集构建到Web应用部署

m2cai16-tool数据集:包含15种腹腔镜手术器械的标注图像Cholec80数据集:包含80个胆囊切除手术视频,标注了7种器械SurgicalTools数据集:包含超过10,000张手术器械图像,涵盖21类常见器械手术剪(Scissors)止血钳(Hemostat)持针器(Needle Holder)手术刀(Scalpel)镊子(Forceps)拉钩(Retractor)吸引器(Suction)

YOLO 395

牛客题解 | 04.00_动态规划

牛客题库题解牛客题库题解

wc529065的博客 1088

实现敌人跟随玩家。(Unity)

首先和玩家设置一模一样,给敌人添加一个刚体,设置一个碰撞器,并设置一个触发器。然后在对场景里面的组件添加导航网格代理并且进行bake烘焙,那样的话敌人就可以在进行烘焙的位置进行移动。创建脚本,并且挂载脚本到敌人的组件上,用代码进行实现效果,并且要挂载目标对象。

weixin_57813136的博客 1868

每日学习Redis——拿捏Redis中的通用指令(键和数据库通用指令)_m_redis-&gt;del(keyresult); m_redis-&gt;del(keytask)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化资料的朋友,可以戳这里获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!pics/618545628)**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、

2401_84170623的博客 939

ubuntu 20.04 搭建多用户远程桌面共享及同时在线使用

摘要:本文介绍了在物理机上配置远程桌面访问的完整流程。通过setup_xrdp.sh脚本自动安装xrdp服务,修改配置文件并开放3389端口。同时提供了用户管理脚本:add_rdp_users.sh用于创建带sudo权限的远程用户,del_rdp_users.sh用于删除用户及主目录。还包含批量操作脚本add_rdp_all.sh和del_rdp_all.sh,支持一次性创建/删除多个用户(如dev1-dev5),所有用户密码统一设置为111111。完整方案实现了远程桌面环境的快速部署和用户集中管理。

622

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!!

huggingface使用git上传model或者Dataset到HF,当然也可以上传代码,以及大文件,很哇塞!!! 第一次使用时,需要使用设置系统全局的huggingface token,这。点击huggingface首页右上角的头像 → settings → access tokens,创建一个write权限的token,名字可以随便取。

拥抱具身智能,昇腾Ascend C 3104

【百日冲大厂】第十三篇,牛客网选择题+编程题参数解析+跳石板(动态规划)

【百日冲大厂】第十三篇,牛客网选择题+编程题参数解析+跳石板(动态规划)

程序员良辰 709

Python 爬虫进阶:淘宝热卖商品价格走势抓取、反爬与分析全流程

在大数据时代,数据是商业决策的重要依据。电商平台上的商品价格走势,对于商家调整经营策略、消费者选择购买时机都有着关键的参考价值。本篇文章将深入解析如何利用 Python 爬虫抓取淘宝热卖商品的价格走势数据,并应对其中的反爬机制,最后对数据进行分析,带领大家领略 Python 爬虫在电商领域的强大应用。

yansideyucsdn的博客 1057

牛客刷题合集-字符串系列(一)

【manim | 算法】OI自动机大炒饭(字典树,KMP自动机,AC自动机,后缀自动机,广义后缀自动机)_哔哩哔哩_bilibili

随便写写 445

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

后端高频面试题 Love 6 刷题合集(第二轮)

文章目录前引后端面试题 刷题博客合集(持续更新) 前引 目前笔者刷题 已经刷过了第一轮 但是对于一些没有第一眼就有思路的题目的话 就需要反复刷 而且第一轮主要是针对腾讯的高频面试题去刷的 这一轮把所有后端的高频面试题都需要加进去 第一轮刷题链接:腾讯后端高频面试题 Love 6 刷题合集(第一轮) 这里也像第一轮一样的 把目前自己的刷题总览贴一张图片出来吧 目前还是有700+了 但我觉得主要还是需要去反复刷那些 自己第一眼没有思路的题目 笔者目前已经很久没有刷过新的题了 都是在反复的做那些自己做过的题

Love 6's Private Blog 2023

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

教育平台、刷题、技术社区

深蓝学院 - 专注人工智能的在线教育 公开课 - 深蓝学院 - 专注人工智能的在线教育 深蓝学院 - 知乎 中国大学MOOC(慕课)_国家精品课程在线学习平台 传智教育官网-好口碑IT培训机构,一样的教育,不一样的品质 黑马程序员官网-IT培训机构|java培训|前端培训|python培训|大数据培训 慕课网-程序员的梦工厂 网易云课堂 - 悄悄变强大 开课吧-在线职业教育 极客学习平台 - 中国专业的IT职业在线教育平台 C++ 如何进阶?如何准备 C++ 面试? - 云+社区 -

牛仔很忙 1154

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JehanRio‘s 后端高频面试题合集

先贴一张图,目前我刷题的记录大概是350多题,加上牛客刷的,差不多有400道题了吧,可能比这个数量少一些。我从22年1月开始陆陆续续刷题,那个时候为了刷蓝桥杯,刷了很多题,很荣幸,在刚开始接触算法一两个月,就拿到了一等奖。但是后面因为期末各种原因,没能继续走下去。直到今年3月开始,才又恢复了刷题的习惯。但这刷过的题中,很多都是很久以前刷的,有些题甚至二刷时还是一点思路没有,属于是刷了忘,忘了刷。在这之前我一直是分专题刷的,现如今也到了该收网总结,模考的时候了。就像是高中高一高二打基础,高三总复习一样。

JehanRio's Private Blog 1154

牛客高频Top200刷题合集(java)

前言(可能牛客排序略有波动) 注:先记录前100,配合剑指offer Top1 反转链表 Top2 排序 Top3 设计LRU缓存结构 Top4 实现二叉树先序,中序和后序遍历 Top5 寻找第K大的数 Top6 两数之和 Top7 合并两个有序链表 Top8 用两个栈实现队列 Top9 跳台阶 Top10 链表中的节点每k个一组翻转 Top11 子数组的最大累加和问题 Top12 最长无重复子数组 Top13 判断链表是否有环 Top14 合并两个有序数组 Top15 链表中环的入口节点 Top16 括号

小样yx的博客 660

迷茫的一周(刷牛客题) 2025/3/28

怀疑人生,知识学一次忘一次

yesyesyes_yes的博客 1055

心法利器[92] | 谈校招:刷题和笔试准备

心法利器本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里:CS的陋室60w字原创算法经验分享-2022版。(2023在路上了!)往期回顾心法利器[87] | 填志愿:AI算法方向过来人的建议心法利器[88] | 有关大模型幻觉问题的思考心法利器[89] | 实...

baidu_25854831的博客 223

牛客刷题|HJ24 合唱队,HJ25 数据分类处理 , HJ26 字符串排序

对队列中每个元素分别找左边最长递增序列和右边最长递减序列(都不一定是连续的),那么以当前元素为“山顶”可以保留的最大人数就是两者之和减一。寻找最长递增序列可以用实现。但测试用例只通过了2/20,我使用其它用户发的代码并作了些格式上的修改,依然只能通过2/20。有没有人能告诉为什么:(

Huiwen18的博客 1182

面试必备:高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 字符串处理+动态规划 合集!

字符串处理 生成括号 给定 n,表示有 n 对括号, 请写一个函数以将其生成所有的括号组合,并返回组合结果。 public List<String> generateParenthesis(int n) { List<String> res = new ArrayList<>(); helper(n, n, "", res); re...

圆号本号 1011

耗时半月,终于把牛客网上的Java面试八股文整理成了PDF合集

为此我花费大量的时间从牛客网上整理的《Java进阶学习+1700页面试核心宝典》分享给大家,内容涵盖的非常丰富,计算机基础、Java、JVM、spring、算法、微服务、分布式、大厂面经、技术脑图等等,质量杠杠的!前段时间有不少小伙伴们私信我,最近的面试题越来越困难了,要背的八股文也越来越多了,考核的也越来越细腻了,摆明了就是想让我们面试造航母嘛,真的是太为难我们这些程序员了。很多的时候,面试官问的东西会和自己刷的“题库”大不一样,即使复盘了,在下一次的面试中还是不知道从何下手。六、分布式篇:2022版。

m0_73311735的博客 277

DP合集(

因为一个结点可能有多个子节点,子节点的子树之间不会相邻,因此是累加。注意别用链式前向星,内存会炸。题面转化:因为每个会去到与这个城市相连的所有不重复城市,因此每天住宿的城市都是不相邻的,最大子矩阵(优化版O(n^3))

weixin_66385155的博客 376

算法的学习笔记—斐波那契数列(牛客JZ10)

本文探讨了斐波那契数列第n项的高效求解方法。介绍了递归法(直观但低效)、动态规划法(时间复杂度O(n))、空间优化动态规划(空间复杂度O(1))和提前计算法(查询O(1))。重点分析了各种算法的时间复杂度与空间复杂度,针对n≤40的情况推荐使用空间优化动态规划法,在保证时间效率的同时实现了最优空间利用。文章还提供了相应代码实现,并附有可视化图示帮助理解数列生成过程。

业精于勤,荒于嬉 897

蓝桥杯备赛避坑指南:从校赛落选到国三逆袭的实战经验分享

本文分享了从蓝桥杯校赛落选到国三逆袭的实战经验,详细解析了备赛初期容易踩的三大坑、高效刷题系统的构建方法、关键算法领域的突破策略以及全程时间管理与资源分配。特别适合普通院校学生参考,帮助他们在蓝桥杯竞赛中取得优异成绩。

weixin_30689307的博客 427
上一篇: 牛客ACM刷题记录——开篇
下一篇: 牛客刷题合集-字符串系列(一)
Toyag
博客等级 码龄8年 190粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值