news 2026/4/15 18:03:20

更弱智的算法学习 day36

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
更弱智的算法学习 day36

1049. 最后一块石头的重量 II

可以这么理解,有一个target = sums // 2,也即有一个目标数组和的一半,把他视为石头一半重量,想要达到的最大价值也即石头一般的重量,每个石头的价值和重量都是他本身。

  • 确定dp数组(dp table)以及下标的含义定义

dp[j]数组表示,石头的当前总重量为j时(也即总目标减去消耗的数值),所能得到的最大值

  • 确定递推公式

dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

还是同样的 dp[j] = max(dp[j], dp[j-nums[j]] + nums[j])

还是同样的dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])

  • dp数组如何初始化

全初始化为0

  • 确定遍历顺序

先顺序遍历道具,在反向遍历背包重量

  • 举例推导dp数组
class Solution: def lastStoneWeightII(self, stones: List[int]) -> int: sums = sum(stones) target = sums // 2 dp = [0] * (target + 1) for i in range(len(stones)): for j in range(target, stones[i]-1, -1): dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]) return sums-dp[target]*2

494. 目标和

设所有数字的总和为sum_nums。我们将添加+的数字集合记为P,其和为plus_sum;添加-的数字集合记为N,其和为minus_sum。则有:

plus_sum + minus_sum = sum_nums (1) plus_sum - minus_sum = target (2)

从上述方程可以推导出两种等价的转化:

  1. 求正数子集和​:由 (1) + (2) 得:

    2 * plus_sum = sum_nums + target plus_sum = (sum_nums + target) / 2

    问题转化为:从nums中选取若干数字,使其和为(sum_nums + target)/2

  2. 求负数子集和​:由 (1) - (2) 得:

    2 * minus_sum = sum_nums - target minus_sum = (sum_nums - target) / 2

    问题转化为:从nums中选取若干数字,使其和为(sum_nums - target)/2

  • 确定dp数组(dp table)以及下标的含义定义

dp[j]数组表示,选取的数字和为j的方法数

  • 确定递推公式
dp[j] += dp[j - num]

这里其实就是dp[j] = dp[j]+dp[j-num]

有选num这个数和不选num这个数两种方法:选了就是dp[j];不选就是dp[j-num]

  • dp数组如何初始化

dp[0] = 1,由于数都大于0,取0的方法只有一种,就是全都不取

  • s < 0:表示abs(target)大于总和,无法实现。

  • s % 2 == 1:表示s是奇数,则new_target = s//2不是整数,而数字和必须是整数。

  • 确定遍历顺序

先顺序遍历数,在遍历背包大小,也即还剩多少数

  • 举例推导dp数组
class Solution: def findTargetSumWays(self, nums: List[int], target: int) -> int: s = sum(nums)-abs(target) if s<0 or s%2==1: return 0 new_target = s//2 dp = [0] * (new_target + 1) dp[0] = 1 for i in range(len(nums)): for j in range(new_target, nums[i]-1, -1): dp[j] += dp[j-nums[i]] return dp[new_target]

474.一和零

相当于背包有两层约束,0和1的数量都不能超了

  • 确定dp数组(dp table)以及下标的含义定义

dp[p][q]数组表示,还剩余可用的p个0和q个1在strs中的最大子集的长度

  • 确定递推公式

显然选择只有两种,选择把strs加入子集和不加入子集,加入子集要消耗对应的0的数量和1的数量,然后子集长度+1,在前面计算好保存在二维数组中了。不加入子集就没有变化。

dp[p][q] = max(dp[p-number[i][0]][q-number[i][1]] + 1,dp[p][q])

  • dp数组如何初始化

都归化为0即可

  • 确定遍历顺序

先顺序遍历字符串,在遍历背包大小的两个维度约束

  • 举例推导dp数组
class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: number = [] for k in range(len(strs)): num0 = strs[k].count('0') num1 = strs[k].count('1') number.append([num0, num1]) dp = [[0] * (n+1) for _ in range(m+1)] for i in range(len(number)): for p in range(m, number[i][0]-1, -1): for q in range(n, number[i][1]-1, -1): dp[p][q] = max(dp[p-number[i][0]][q-number[i][1]] + 1,dp[p][q]) return dp[m][n]

可以通过下面的方法来简化数组的使用,但是差别不大

class Solution: def findMaxForm(self, strs: List[str], m: int, n: int) -> int: f = [[0] * (n + 1) for _ in range(m + 1)] for s in strs: cnt0 = s.count('0') cnt1 = len(s) - cnt0 for j in range(m, cnt0 - 1, -1): for k in range(n, cnt1 - 1, -1): f[j][k] = max(f[j][k], f[j - cnt0][k - cnt1] + 1) return f[m][n]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 5:00:08

渗透测试——Funbox2靶机渗透提权详细过程(FTP匿名登陆与SSH爆破)

今天继续给大家带来vulnhub系列的Funbox2靶机详细的渗透横提权过程&#xff1b; 本次渗透过程&#xff0c;也是学到了新知识&#xff1a; FTP匿名登陆下载文件使用SSH爆破工具登陆用户SUDO提权 文章目录前置准备信息收集访问http页面漏洞一&#xff1a;FTP(匿名登录功能)漏洞二…

作者头像 李华
网站建设 2026/4/15 13:13:05

python基于flask框架的在线音乐推荐排行榜网站

目录基于Flask框架的在线音乐推荐排行榜网站摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Flask框架的在线音乐推荐排行榜网站摘要 该网站采用Python的Flask框架开发&#xff0c;…

作者头像 李华
网站建设 2026/4/10 8:34:18

别再纠结哪个AI做PPT靠谱!“轻竹办公AIPPT”一站式解

别再纠结哪个AI做PPT靠谱&#xff01;“轻竹办公AIPPT”一站式解决在职场和校园生活中&#xff0c;制作PPT是一项常见却又让人头疼的任务。很多人都有过这样的经历&#xff1a;内容已经准备好&#xff0c;却不知道如何快速整理成一份结构清晰、重点突出的PPT。从空白页开始搭建…

作者头像 李华
网站建设 2026/4/10 20:25:11

事务中的隔离性是如何保证的呢?(你解释一下MVCC)

事务的隔离性通过锁和多版本并发控制&#xff08;MVCC&#xff09;来保证。MVCC通过维护数据的多个版本来避免读写冲突。底层实现包括隐藏字段、undo log和read view。隐藏字段包括trx_id和roll_pointer。undo log记录了不同版本的数据&#xff0c;通过roll_pointer形成版本链。…

作者头像 李华
网站建设 2026/4/14 23:50:45

既然强转会报错,java为啥不封装处理好,避免强转报错?

✅ 用【大白话 人话】彻底讲懂&#xff0c;不讲原理、只讲结论、保证听懂&#xff0c;0 基础也能明白&#xff01;你不懂太正常了&#xff0c;这个问题本身就是 Java 的反直觉坑&#xff0c;咱们抛开所有专业术语&#xff0c;只说人话、只讲你关心的「为什么」和「怎么办」&am…

作者头像 李华