动态规划第4讲——计数问题中的DP算法

DP不仅广泛用于各种最优化问题,也常常用于排列组合的个数、概率期望计算等等,因为这些问题往往具有很好的“ 重叠子问题”特性,这些问题往往都起源于排列组合中的组合公式A(n, k) = A(n-1, k) + A(n-1, k-1)

例一:求解划分数

有n个无差别的物品,将他们划分成不超过m组,求划分方法数除以M的余数。

分析:dp[i][j]j的i划分的总数

dp[i][j] = dp[i][j-i] + dp[i-1][j] 物理意义:将j个物品分成i份,有两种情况:每份划分都大于等于1 dp[i][j-i]; 存在有一份以上用0划分dp[i-1][j]

例二:有n种物品,第i种有a[i]个,从中选取m个,有多少种不同的选择方法?

dp[i+1][j]:从[0, i]号物品中选取j个物品的方法。

dp[i+1][j] = dp[i][j] + dp[i+1][j-1]

这是我们很直观想到的一个递推关系:dp[i][j]:从i号物品中选0个, dp[i+1][j-1]从i号物品中至少选择1个

实际上,由于是多重集而不是完全集合,因为我们已经选取了一个i号物品,所以dp[i+1][j-1]表示的不是从i号物品中选择至少一个的数目,因为dp[i+1][j-1]包含了选取a[i]个i号物品,而实际上,这种情况是因该去掉的(因为i号物品的数量已经是a[i]-1了)。so, 结果的基础上,需要减去dp[i][j-a[i]-1],也就是

dp[i+1][j] = dp[i][j] + dp[i+1][j-1] - dp[i][j-1-a[i]];

时间: 2024-08-05 21:22:52

动态规划第4讲——计数问题中的DP算法的相关文章

0-1背包的动态规划算法,部分背包的贪心算法和DP算法------算法导论

一.问题描述 0-1背包问题,部分背包问题.分别实现0-1背包的DP算法,部分背包的贪心算法和DP算法. 二.算法原理 (1)0-1背包的DP算法 0-1背包问题:有n件物品和一个容量为W的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大.其中每种物品只有一件,可以选择放或者不放. 最优子结构性质:对于0-1问题,考虑重量至多W的最值钱的一包东西.如果去掉其中一个物品j,余下的必是除j以外的n-1件物品中,可以带走的重量

详解动态规划——邹博讲动态规划

7号晚听了邹博一次微课,正好是自己最近正在死磕的动态规划,所以搬好小板凳听邹博讲解动态规划.现将内容整理如下: 内容主要分为两个部分: 1. 动态规划和贪心的认识——工具:马尔科夫过程 2. 动态规划,通过3个DP中的经典问题详细讲解 1)最长递增子序列LIS 2)格子取数/走棋盘问题及应用 3)找零钱/背包问题 正题开始.首先,人们认识事物的方法有三种:通过概念(即对事物的基本认识).通过判断(即对事物的加深认识).和推理(对事物的深层认识).其中,推理又包含归纳法和演绎法.(这些从初中高中一

动态规划——DP算法(Dynamic Programing)

一.斐波那契数列(递归VS动态规划) 1.斐波那契数列——递归实现(python语言)——自顶向下 递归调用是非常耗费内存的,程序虽然简洁可是算法复杂度为O(2^n),当n很大时,程序运行很慢,甚至内存爆满. 1 def fib(n): 2 #终止条件,也就是递归出口 3 if n == 0 or n == 1: 4 return 1 5 else: 6 #递归条件 7 return (fib(n-1) + fib(n - 2)) 2.斐波那契数列——动态规划实现(python语言)——自底向上

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕: 预先有一个名为 cars.py 的文件,其内容为: cars = ['honda','yamaha','suzuki'] print(cars) cars[0] = 'ducati' print(cars) cars.append('马大哈') print(sorted(cars)) print(cars) 接下来写生成代码: def check_file(): # 创建一个名为 check_file 的生成器

最大子段和的DP算法设计及其效率测试

表情包形象取自番剧<猫咪日常> 那我也整一个 曾几何时,笔者是个对算法这个概念漠不关心的人,由衷地感觉它就是一种和奥数一样华而不实的存在,即便不使用任何算法的思想我一样能写出能跑的程序 直到一年前帮同学做了个手机游戏demo才发现了一个严峻的问题 为啥*一样的画面能跑出ppt的质感? 虽然发现当时的问题主要出现在使用了一个有bug的API,它导致了低性能的循环调用,但是从那时便开始就重新审视算法了,仅仅一个函数就能大幅地改变程序带给用户的体验这个观念根植心底 后来多多少少也学习了一些算法的知识

数字图像处理之快速中值滤波算法

快速中值滤波算法 中值滤波算法: 在图像处理中,在进行如边缘检测这样的进一步处理之前,通常需要首先进行一定程度的降噪.中值滤波是一种非线性数字滤波器技术,经常用于去除图像或者其它信号中的噪声.这个设计思想就是检查输入信号中的采样并判断它是否代表了信号,使用奇数个采样组成的观察窗实现这项功能.观察窗口中的数值进行排序,位于观察窗中间的中值作为输出.然后,丢弃最早的值,取得新的采样,重复上面的计算过程.中值滤波是图像处理中的一个常用步骤,它对于斑点噪声和椒盐噪声来说尤其有用.保存边缘的特性使它在不希

算导之DP算法的设计心得

和其他的DP帖子只是灌输思考之后的结果不同,这篇是DP算法的自我体会,应该是设计DP算法的思考过程. 斯以为,这才是拿到一问题,从思考到解决最精华的部分:) 犹记得第一次看到算法导论上拿最长与最短路径来说明DP中最优子结构证明过程的一个细节的时候,心里激动不已,国内的教材完全不考虑这个,而是把伟人思考之后的东西呈现给新人. 我第一看到,心想,这就是我要的东西,包括之前的loop invariant也是如此,看国内教材时缺失而又如此渴望的东西,在算导中再次给出完美的答案. 寻找最优子结构: 1.

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置.货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值.由于小数点位置固定,所以可以直接用四位数值来表达相应的数值.SQL 中的 NUMBER 数据类型就是利用定点数来定义的.还有一种提议的表达方式为有理数表达方式,

分布式数据库中的Paxos 算法

分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvYfDDmg3Rg1Aw6YyobKozdN599x2sCiJNNHV_ Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法.这个算法被认为是类似算法中最有效的. 中文名 Paxo