状态方程

第九讲 背包问题问法的变化

若如初见. 提交于 2019-11-29 09:37:26
以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。 例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。 还有,如果要求的是“总价值最小”“总件数最小”,只需简单的将上面的状态转移方程中的max改成min即可。 下面说一些变化更大的问法。 输出方案 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪一个策略推出来的。便可根据这条策略找到上一个状态,从上一个状态接着向前推即可。 还是以01背包为例,方程为 f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 。再用一个数组g[i][v],设g[i][v]=0表示推出f[i][v]的值时是采用了方程的前一项(也即f[i][v]=f[i-1][v]),g[i][v]表示采用了方程的后一项。注意这两项分别表示了两种策略:未选第i个物品及选了第i个物品。那么输出方案的伪代码可以这样写(设最终状态为f[N][V]): 另外

动态规划之初识动规:有了四步解题法模板,再也不害怕动态规划!

旧巷老猫 提交于 2019-11-28 22:21:09
导言 动态规划问题一直是算法面试当中的重点和难点,并且动态规划这种通过空间换取时间的算法思想在实际的工作中也会被频繁用到,这篇文章的目的主要是解释清楚 什么是动态规划 ,还有就是面对一道动态规划问题,一般的 思考步骤 以及其中的注意事项等等,最后通过几道题目将理论和实践结合。 什么是动态规划 如果你还没有听说过动态规划,或者仅仅只有耳闻,或许你可以看看 Quora 上面的这个 回答 。 用一句话解释动态规划就是 “ 记住你之前做过的事 ”,如果更准确些,其实是 “ 记住你之前得到的答案 ”。 我举个大家工作中经常遇到的例子。 在软件开发中,大家经常会遇到一些系统配置的问题,配置不对,系统就会报错,这个时候一般都会去 Google 或者是查阅相关的文档,花了一定的时间将配置修改好。 过了一段时间,去到另一个系统,遇到类似的问题,这个时候已经记不清之前修改过的配置文件长什么样,这个时候有两种方案,一种方案还是去 Google 或者查阅文档,另一种方案是借鉴之前修改过的配置,第一种做法其实是万金油,因为你遇到的任何问题其实都可以去 Google,去查阅相关文件找答案,但是这会花费一定的时间,相比之下,第二种方案肯定会更加地节约时间,但是这个方案是有条件的,条件如下: 之前的问题和当前的问题有着关联性,换句话说,之前问题得到的答案可以帮助解决当前问题 需要记录之前问题的答案

背包问题的转化

廉价感情. 提交于 2019-11-26 23:52:28
转载自:https://www.lmlphp.com/user/56/article/item/4098/ 以上涉及的各种背包问题都是要求在背包容量(费用)的限制下求可以取到的最大价值,但背包问题还有很多种灵活的问法,在这里值得提一下。但是我认为,只要深入理解了求背包问题最大价值的方法,即使问法变化了,也是不难想出算法的。 例如,求解最多可以放多少件物品或者最多可以装满多少背包的空间。这都可以根据具体问题利用前面的方程求出所有状态的值(f数组)之后得到。 还有,如果要求的是“总价值最小”“总件数最小”,只需简单的将上面的状态转移方程中的max改成min即可。 下面说一些变化更大的问法。 输出方案 一般而言,背包问题是要求一个最优值,如果要求输出这个最优值的方案,可以参照一般动态规划问题输出方案的方法:记录下每个状态的最优值是由状态转移方程的哪一项推出来的,换句话说,记录下它是由哪一个策略推出来的。便可根据这条策略找到上一个状态,从上一个状态接着向前推即可。 还是以01背包为例,方程为 f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 再用一个数组g[i][v],设g[i][v]=0表示推出f[i][v]的值时是采用了方程的前一项(也即f[i][v]=f[i-1][v]),g[i][v]表示采用了方程的后一项。注意这两项分别表示了两种策略

通过扩欧得出线性同余方程的通解以及x的最小正整数解

ぃ、小莉子 提交于 2019-11-26 15:55:19
同余定理 若 ax与b模m的余数相同(其中x为未知数,即所需要求的数),即 ax%m=b%m ,则这个式子可以记作成 a≡b (mod m) 。 设ax对m取模后的余数为r1,则有: ax=y1 m+r1。 ① 同理,设b对m取模后的余数为r2,则有: b=y2 m+r2。 ② 其中y1与y2均为任意整数,此时两则互不相干。 那么我们知道,由于ax%m=b%m,则 r1=r2 ,联立①②得:ax-y1 m=b-y2 m,移项最后得出方程: ax+my=b 这个方程叫 线性同余方程 ,由于未知数x为一阶的,所以也称为 一次同余方程。 这个方程的形式也使它叫作 不定方程。 这个方程的一个性质是:若至少有一组解(x0,y0)能使得这个方程成立,则当且仅当gcd(a,m)|b, 即a与m的最大公约数能被b整除。 (裴蜀定理) 如果我们直接求解的话,当然是不行的了~那么接下来会由扩展欧几里得算法来求出这个方程的通解。 在接下来之前,我们有牢记一个东西,方程ax+my=b,它是关于(x,y)的一个二元一次方程,切记它的 右半边式子是已知的数b。 (一般题目推出来,a、b、m都是已知的。求x,y) 设g=gcd(a,m), 而扩展欧几里得算法只是求方程:ax+my=g的一组特解。 扩展欧几里得算法 对于方程: ax+my=g ,用ex_gcd(扩欧)求出一组解(x0,y0)满足这个方程。

【学习笔记】动态规划—各种 DP 优化

雨燕双飞 提交于 2019-11-26 09:20:18
【学习笔记】动态规划—各种 DP 优化 【大前言】 个人认为贪心, \(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT)。这篇文章也是花了我差不多一个月时间才全部完成。 【进入正题】 用动态规划解决问题具有 空间耗费大 、 时间效率高 的特点,但也会有时间效率不能满足要求的时候,如果算法有可以优化的余地,就可以考虑时间效率的优化。 【DP 时间复杂度的分析】 \(DP\) 高时间效率的关键在于它减少了“ 冗余 ”,即不必要的计算或重复计算部分,算法的冗余程度是决定算法效率的关键。而动态规划就是在将问题规模不断缩小的同时,记录已经求解过的子问题的解,充分利用求解结果,避免了反复求解同一子问题的现象,从而减少“ 冗余 ”。 但是,一个动态规划问题很难做到完全消除“ 冗余 ”。 下面给出动态规划时间复杂度的决定因素: 时间复杂度 \(=\) 状态总数 \(×\) 每个状态转移的状态数 \(×\) 每次状态转移的时间 【DP 优化思路】 一:减少状态总数 \((1).\) 改进状态表示 \((2).\) 选择适当的规划方向 二:减少每个状态转移的状态数 \((1).\) 四边形不等式和决策的单调性 \((2).\) 决策量的优化 \((3).\) 合理组织状态 \((4).\) 细化状态转移 三:减少状态转移的时间 \((1).\) 减少决策时间 \(