[计数dp] 整数划分(模板题+计数dp+完全背包变种题)
计数类 dp 可分为 计数 dp 和数位统计 dp。大多是用来统计方案数什么的,特别强调 不重不漏,在此还是根据各个题的特点将计数 dp 和数位 dp 分开整理。其实数位 dp 的题目会相对多很多…
计数dp 模板题
AcWing 900.整数划分

重点: 计数 dp、完全背包问题抽象
首先模拟下样例便于理解本题:
5 = 5
= 4 + 1
= 3 + 2
= 3 + 1 + 1
= 2 + 1 + 1 + 1
= 2 + 2 + 1
= 1 + 1 + 1 + 1 + 1
共七种划分方式
故我们可以将问题抽象为一个容量为 n 的背包,有 n 个体积为 1 ~ n 的物品,求恰好将该背包的方案数。每种物品可以使用无限次,故该问题是一个完全背包问题。
思路:
- 状态定义:
f[i][j]:从 1~i 中选,且总体积恰好为 j 的选法数量
- 状态转移:
- 分类依据:根据最后一个物品选择个数进行状态划分,和完全背包问题的状态划分一致。
- 第 i 个物品选 0 个:
f[i-1][j] - 第 i 个物品选 1 个:
f[i-1][j - i] - 第 i 个物品选 2 个:
f[i-1][j - 2*i] - 第 i 个物品选 s 个:
f[i-1][j - s*i]
- 第 i 个物品选 0 个:
- 至此,朴素版完全背包问题就到此为止。但是,完全背包问题有一个非常厉害的优化方式。建议阅读:[背包] 背包问题算法模板(模板)
f[i][j] = f[i-1][j]+f[i-1][j-1]+f[i-1][j-i*2]+...+f[i-1][j-i*s]f[i][j-i] = f[i-1][j-i]+f[i-1][j-i*2] +..+ f[i-1][j-i*s]- 仔细对比,发现 f[i][j-i] 和 f[i][j] 的后半段一样,故:
f[i][j] = f[i-1][j] + f[i][j-i]
- 故状态转移方程为:
f[i][j]=f[i-1][j]+f[i][j-i] - 和完全背包问题一样,也可以优化掉第一维,即 f[i]=f[j]+f[j-i]。体积从小到大循环即可
- 分类依据:根据最后一个物品选择个数进行状态划分,和完全背包问题的状态划分一致。
- 状态初始化:f[0]=1,一个数都不选的方案是 1
完全背包代码:
const int mod = 1e9 + 7;
void solve() {
int n;
cin >> n;
int f[n + 1] = {1};
for (int i = 1; i <= n; ++i)
for (int j = i; j <= n; ++j)
f[j] = (f[j] + f[j - i]) % mod;
cout << f[n] << endl;
}
除了完全背包的写法及状态定义外,也有一种其它的状态定义方式,状态转移方程不同但是却能得到相同的结果…
思路:
- 状态定义:
f[i][j]:所有总和是 i,并且恰好表示成 j 个数的和的方案的数量
- 状态转移:
- 分类依据:根据表示成的这 j 个数中是否包含 1,来进行集合划分
- 如果包含 1,等价于
f[i-1][j-1],等价于和是 i-1 数量是 j-1 的选法数量 - 如果每个数大于 1,则等价于将这 j 个数全部减去一个 1,则总数减去了 j,其和 f[i-j][j] 方案数相等。
- 如果包含 1,等价于
- 故状态转移方程
f[i][j] = f[i-1][j-1]+f[i-j][j] - 答案即为
ans = f[n][1] + f[n][2] +...+f[n][n]
- 分类依据:根据表示成的这 j 个数中是否包含 1,来进行集合划分
- 状态初始化:
f[0][0] = 1代表总和是 0 的时候选 0 个的方案数是 1
代码:
const int mod = 1e9 + 7;
const int N = 1e3 + 10;
int f[N][N];
void solve() {
int n;
cin >> n, f[0][0] = 1;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= i; ++j)
f[i][j] = (f[i - 1][j - 1] + f[i - j][j]) % mod;
int ans = 0;
for (int i = 1; i <= n; ++i)ans = (ans + f[n][i]) % mod;
cout << ans << endl;
}
故可看出,同一个 dp 问题,不同的思考方式,不同的集合划分,不同的状态转移方程,只有思路是正确的,那么就是可行的。当然,在本题,划分方式不同导致了状态转移方程的不同,进而导致了求解答案时也不同。
参考
[计数dp] 整数划分(模板题+计数dp+完全背包变种题)的更多相关文章
- NYOJ90 整数划分(经典递归和dp)
整数划分 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1. 正 ...
- HDU 1028 Ignatius and the Princess III dp整数划分
http://acm.hdu.edu.cn/showproblem.php?pid=1028 dp[i][j]表示数值为i,然后最小拆分的那个数是j的时候的总和. 1 = 1 2 = 1 + 1 . ...
- 51nod 1201:整数划分 超级好的DP题目
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} { ...
- HDU 5230 ZCC loves hacking 大数字的整数划分
http://acm.hdu.edu.cn/showproblem.php?pid=5230 把题目简化后,就是求 1---n - 1这些数字中,将其进行整数划分,其中整数划分中不能有重复的数字,如果 ...
- HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结
题意:给定一个字符串 输出回文子序列的个数 一个字符也算一个回文 很明显的区间dp 就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...
- 51nod 1201 整数划分 基础DP
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} ...
- hdu 5230 整数划分 dp
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5230 题意:给定n,c,l,r.求有多少种方法从1~n-1选取任意k数每个数的权重为其下标,使得这些数字之 ...
- 【noi 2.6_8787】数的划分(DP){附【转】整数划分的解题方法}
题意:问把整数N分成K份的分法数.(与"放苹果"不同,在这题不可以有一份为空,但可以类比)解法:f[i][j]表示把i分成j份的方案数.f[i][j]=f[i-1][j-1](新开 ...
- 整数划分 (区间DP)
整数划分(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 暑假来了,hrdv 又要留学校在参加ACM集训了,集训的生活非常Happy(ps:你懂得),可是他最近 ...
- 51nod 1201 整数划分 dp
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 收藏 关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...
随机推荐
- Linux 运维人员最常用 150+命令汇总
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 目录 版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 命令帮助手册1 命令帮助手册2 ...
- Linux驱动开发笔记(五):驱动连接用户层与内核层的文件操作集原理和Demo
前言 驱动写好后,用户层使用系统函数调用操作相关驱动从而实现与系统内核的关联,本篇主要就是理解清楚驱动如何让用户编程来实现与内核的交互. 杂项设备文件操作集 cd /usr/src/linux ...
- Silverlight工作流控件功能缺失,Windows Server操作系统 IIS添加WCF功能
注: Silverlight工作流控件,如果在网页中打不开,则要判断是否缺少Silverlight工作流控件的插件程序,如果不是则可以进行一下步骤检查,如果是以下原因则是:由于IIS版本问题,安装后可 ...
- three.js 汽车行驶效果
实现原理是使用TWEEN.Tween实现动画效果 实现 汽车模型加载 使用Promise编写模型的异步加载方法 Car.prototype.loadCar = function (position, ...
- C++ Qt开发:如何使用信号与槽
在Qt中,信号与槽(Signal and Slot)是一种用于对象之间通信的机制.是Qt框架引以为傲的一项机制,它带来了许多优势,使得Qt成为一个强大且灵活的开发框架之一.信号与槽的关联通过QObje ...
- [ABC263G] Erasing Prime Pairs
Problem Statement There are integers with $N$ different values written on a blackboard. The $i$-th v ...
- tensorflow GPU版本配置加速环境
import tensorflow as tf tf.test.is_gpu_available() 背景 环境:Anaconda .tensorflow_gpu==1.4.0 (这里就用1.4.0版 ...
- CSS语法检查利器之csslint
本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 背景 前段时间研究使用YUI Compressor压缩项目里的js和cs ...
- ASR项目实战-决策点
针对语音识别的产品,分别记录设计.开发过程中的决策点. 实时语音识别 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果. 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时 ...
- 一个WPF版的Layui前端UI库
前言 相信做.NET后端开发的很多小伙伴都用过Layui前端UI组件库,今天我们分享一个WPF版的Layui前端UI样式库:Layui-WPF. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于 ...