- 博客(11)
- 收藏
- 关注
原创 honeydream的dp日记2
01背包问题的特点是对于某种物品,数量只有一个,完全背包的特点则是无穷个,多重背包的特点是数量为有限个。但是我们可以将多重背包的物品一个一个取出来再当成01背包做,这是多重背包的做法,比如我有两个物品,数量分别为3和5,我们可以把这一堆物品当作八个物品然后按照01背包来写。但是这样的话如果数据量过大就会导致TLE,于是我们就有了二进制优化!
2025-07-30 15:54:57
728
2
原创 Honeydream的dp日记
阶段:把原问题视为若干个重叠子问题的逐层递进,每个子问题的求解过程都构成一个阶段状态:每个阶段面临的状况决策:不同阶段之间转移的选取子问题重叠性:子问题会被反复计算多次,因此递推保存在数组中无后效性:现在的子问题不受后面子问题影响最优子结构:下一个阶段的最优解应该能够由前面各阶段子问题的最优解导出,只保留与最终解集相关的部分代表信息。
2025-03-30 18:43:31
1799
原创 2025.3.15刷题心得
这题乍一看也是一题前缀和,然而不同之处在于不算很常规很无脑的前缀和,起初博主是想把全部体重,鼠鼠体重,鸭鸭体重前缀和分别求出来,然后通过判断什么区间能让鼠鼠更多和鸭鸭更少,鸭鸭体重之和最大,但我发现这样构建好像并没有什么卵用。用一个数组记录是鼠鼠还是鸭鸭,将鸭鸭的原始体重之和求出来,基于对一个区间内使用一次魔法,会让这个原始体重加上所有被施展魔法的鼠鼠体重,也会减去所有被施展魔法的鸭鸭体重。这边建议i,j也不要从0开始,不然容易越界访问。如此就可以构建一个从(1,1)到(i,j)的前缀和数组。
2025-03-16 17:35:11
317
原创 解析一下——洛谷p3741 小果的键盘
首先可以通过一个循环找出改变之前的vk个数,那么思考一下,什么时候改变一次才会让vk的个数加一呢,通过推理可以得到,当出现vv或kk的时候就能通过一次改变使vk的次数加一。其实这是一道很水的题,博主几乎用了几分钟就AC了,题目看起来会有一个很复杂的推导过程,实则只需要意识到一个小小规律即可。先扫一遍字符串找vk数量,再扫第二遍找vv或kk,找到就把ans加一,最后输出就行了。由于最多只能改变一次字符,也就是只用找出一对vv或kk即可。
2025-03-15 12:00:02
254
原创 解析一下——洛谷p1739 表达式括号匹配
了解了栈的相关操作之后,下面我来介绍一下这个题的思路,其实不需要开字符串,只需要检查每次输出的字符即可,如果输入的字符为左括号就把它压入栈内,如果检测到右括号就将栈内元素弹出,当然,在弹出之前先检测一下栈是否为空,如果是,那么说明已经没有对应的左括号与之匹配,可以直接退出循环不用继续下一步操作,这样可以减少时间复杂度。这题是经典的利用栈解决的问题,为了简便,我们不需要手打栈,只需要引入c++STL里的<stack>库然后直接使用库函数进行栈操作即可。如何定义一个栈呢,其实和定义vector数组一样的格式。
2025-02-27 15:44:21
495
原创 解析一下——洛谷p1873 砍树
二分答案代入check函数,如果砍下的木材总长度大于给定的长度就说明假设的答案小于实际答案,(答案的高度越小砍下的木材越多),所以要将左边界赋值mid,反之将右边界赋值mid,直到l+1>=r为止,此时l是正确答案。大体思路是将答案二分代入check函数,将每个大于假设的答案用a[i]减去(假设的答案比a[i]大的话)然后用一个变量记录砍下来得到的木材数,然后与指定的M进行比较,返回相应的值即可。对于这道题,放眼望去,答案有区间范围,而且数据量比较大,不适合使用暴力枚举,用二分即可顺利解决。
2025-02-23 00:40:58
255
原创 解析一下——洛谷p2678 跳石头
我做这道题的过程并不容易,首先便是把题目意思理解错了,我将每次跳跃的最小距离错误地认为成了两个初始相邻石头之间的距离,然后遍历的时候总结用a[i]-a[i-1]来表示每次的跳跃距离,然而实际上跳跃距离是要先进行判断,看是否比假设的距离还要小,是的话就要先丢弃那个石头再跳跃。但是我将样例通过以后发现,额,只是碰巧过了样例而已,下面请看。首先看到题目,要找最大化的最小值,结合1e9的数据范围,那么基本可以确定要用到二分了,根据题意,可以知道不是二分查找,而是二分答案,在一个单调区间内试答案。
2025-02-17 21:08:58
660
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅