news 2026/9/19 5:02:33

华为机试 DP 牛客实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为机试 DP 牛客实例

华为机试 DP 牛客实例(Python,可直接提交)

华为机试DP一般是一维DP为主,很少复杂二维DP。常考:最长递增子序列、最大子数组和、背包、跳台阶。
下面给2道最常考真题风格
① 连续子数组最大和(简单DP,高频)
② 最长递增子序列LIS(中等,华为真题多次出现)

例1:最大子数组和(牛客经典,一维DP)

题目描述

给定一个整数数组,找出连续子数组的最大和。
数组元素可正可负。
输入:一行多个整数,空格分隔
输出:最大子数组和

输入样例

-2 1 -3 4 -1 2 1 -5 4

输出样例

6

解释:[4,-1,2,1] 和为6

完整可提交代码

importsysdefmain():lines=sys.stdin.read().splitlines()arr=list(map(int,lines[0].split()))n=len(arr)ifn==0:print(0)return# dp[i]:以arr[i]结尾的连续子数组最大和dp=[0]*n dp[0]=arr[0]res=dp[0]foriinrange(1,n):# 选:接上前面子数组;不选:自己单独开始dp[i]=max(arr[i],dp[i-1]+arr[i])ifdp[i]>res:res=dp[i]print(res)if__name__=="__main__":main()

空间优化版本(机试推荐,O(1)空间,不用dp数组)

importsysdefmain():lines=sys.stdin.read().splitlines()arr=list(map(int,lines[0].split()))pre=arr[0]ans=arr[0]fornuminarr[1:]:pre=max(num,pre+num)ans=max(ans,pre)print(ans)if__name__=="__main__":main()

DP状态转移:dp[i] = max(nums[i], dp[i-1]+nums[i])
含义:要么把当前数字接在前面的子数组,要么从当前数字重新开始。


例2:最长递增子序列 LIS(华为高频中等DP题)

子序列不需要连续!!重点区分【子串(连续)】vs【子序列(不连续)】

题目描述

给定数组,求最长严格递增子序列长度。
输入:一行整数
输入样例

10 9 2 5 3 7 101 18

输出

4

解释:[2,3,7,101] 长度4

DP O(n²) 版本(容易写,适合机试,数据不大直接用)

importsysdefmain():lines=sys.stdin.read().splitlines()arr=list(map(int,lines[0].split()))n=len(arr)ifn==0:print(0)return# dp[i]:以arr[i]结尾的最长递增子序列长度dp=[1]*n max_len=1foriinrange(n):forjinrange(i):ifarr[j]<arr[i]:ifdp[j]+1>dp[i]:dp[i]=dp[j]+1max_len=max(max_len,dp[i])print(max_len)if__name__=="__main__":main()

状态:dp[i]以i结尾的LIS长度
转移:如果arr[j]<arr[i]dp[i] = max(dp[i], dp[j]+1)

优化O(n log n)版本(数据量大,n>1000时用)

importsysimportbisectdefmain():lines=sys.stdin.read().splitlines()arr=list(map(int,lines[0].split()))tails=[]forxinarr:idx=bisect.bisect_left(tails,x)ifidx==len(tails):tails.append(x)else:tails[idx]=xprint(len(tails))if__name__=="__main__":main()

例3:跳台阶(简单DP,华为真题,斐波那契变形)

题目描述

一次可以跳1级或者2级台阶,求跳到n级总方法数
输入:n
样例输入:5
输出:8

importsysdefmain():lines=sys.stdin.read().splitlines()n=int(lines[0])ifn<=2:print(n)returndp=[0]*(n+1)dp[1]=1dp[2]=2foriinrange(3,n+1):dp[i]=dp[i-1]+dp[i-2]print(dp[n])if__name__=="__main__":main()

状态:dp[i]到达第i阶方案数
转移:dp[i] = dp[i-1] + dp[i-2]
最后一步跳1阶,或者跳2阶

DP做题四步法(机试写DP固定流程,必背)

  1. 定义dp数组含义:dp[i]代表什么(最关键!定义错直接全错)
  2. 找初始条件 base casedp[0], dp[1]
  3. 推导状态转移方程,从小例子手动验算
  4. 遍历顺序:一维一般从左向右

DP机试避坑

  1. 区分子串(连续)子序列(可不连续),题目读仔细
  2. 初始化!很多人忘记初始化dp数组,出现负数、0错误
  3. 空间能优化就优化,一维dp经常只需要保存前一个值
  4. 数据范围大的时候,O(n²)会超时,改用二分优化LIS
  5. 数组下标:从0还是从1开始,不要混用

DP选型速查

题目DP转移
最大连续子数组dp[i] = max(nums[i], dp[i-1]+nums[i])
LIS最长递增子序列dp[i] = max(dp[i], dp[j]+1)
跳台阶dp[i] = dp[i-1]+dp[i-2]

要不要再来01背包完整样题(华为偶尔考二维DP)?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 5:16:10

译码器与显示器:数字系统信号转换的硬件底层逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 5:07:32

企业数字化去供应商化:从被动依赖到自主掌控的路径

身边很多做企业的朋友都跟我聊过同一个困扰&#xff1a;数字化项目上线时好好的&#xff0c;越用越别扭。系统是供应商的&#xff0c;代码是供应商的&#xff0c;数据也存在供应商的服务器里&#xff0c;想改个字段要提工单&#xff0c;想加个接口要等排期&#xff0c;合同到期…

作者头像 李华
网站建设 2026/9/19 5:08:36

福州房地产评估公司怎么选?采购评审与资质门槛拆解

结论先行&#xff1a; 选评估机构&#xff0c;本质是做一次"资格预审"。先看资质是否齐、再看信用有没有硬伤、最后看流程能不能对上你用报告的场景。据福建农业职业技术学院官网2026年8月采购结果公示&#xff0c;该校食堂评估项目经5家供应商竞标&#xff0c;最终由…

作者头像 李华