大概是:整数划分||DP||母函数||递推
整数划分问题
整数划分是一个经典的问题。
Input
每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n)
Output
对于每组输入,请输出六行。
第一行: 将n划分成若干正整数之和的划分数。
第二行: 将n划分成k个正整数之和的划分数。
第三行: 将n划分成最大数不超过k的划分数。
第四行: 将n划分成若干奇正整数之和的划分数。
第五行: 将n划分成若干不同整数之和的划分数。
第六行: 打印一个空行。
for(j=1;j<=N;j++)
f[0][j]=1;
for(j=1;j<=N;j++)
for(i=j;i<=N;i++)
f[i][j]=f[i-j][j]+f[i][j-1];
一维数组优化:
f[0]=1;
for(j=1;j<=N;j++)
for(i=j;i<=N;i++)//这个顺序每一个数可以取x次
f[i]+=f[i-j];
第二个f[i][j][k]表示把i划分成不超过j的k个数的划分数,f[i][j][k]=f[i-j][j][k-1]+f[i][j-1][k],输出f[N][N][K]。这个问题也是可以重复元素的,(如果不允许重复元素就用f[i][j][k]=f[i-j]
for(j=0;j<=N;j++)
f[0][j][0]=1;
for(k=1;k<=K;k++)
for(j=1;j<=N;j++)
for(i=j;i<=N;i++)
f[i][j][k]=f[i-j][j][k-1]+f[i][j-1][k];
第四个f[i][j]表示把i划分成不超过j的奇数的划分数,f[i][j]=f[i-j][j]+f[i][j-2],递推循环时保证j是奇数,本质上和第一个相同。如果N是奇数输出f[N][N],N是偶数输出f[N][N-1]。(如果不允许重复元素就f[i][j]=f[i-j][j-2]+f[i][j-2]),外层循环j由小到大,内层i由小到大。
for(j=1;j<=N;j+=2)
f[0][j]=1;
for(j=1;j<=N;j+=2)
for(i=j;i<=N;i++)
f[i][j]=f[i-j][j]+f[i][j-2];
一维数组优化:
f[0]=1;
for(j=1;j<=N;j+=2)
for(i=1;i<=N;i++)
f[i]+=f[i-j];
for(j=1;j<=N;j++)
f[0][j]=1;
for(j=1;j<=N;j++)
for(i=j;i<=N;i++)
f[i][j]=f[i-j][j-1]+f[i][j-1];
一维数组优化:
f[0]=1;
for(j=1;j<=N;j++)
for(i=N;i>=j;i--)//这个顺序代表j只能用一次,区分第一个
f[i]+=f[i-j];
注意:
(1)这些实际上都是简单的背包问题的变种,递推方法与背包问题类似。
(2)由于答案可能很大,可能涉及到高精度,但这不影响算法。
(3)以上递推都是最浅显易懂的写法,事实上除第二个以外都可以优化到用一维数组递推(省略[j]),而第二个可以优化到用二维数组递推(省略[k])
如果还有不能理解的可以草稿纸上写一下或者用程序把递推出的矩阵打出来看一下,应该就能明白了。
大概是:整数划分||DP||母函数||递推的更多相关文章
- [AHOI2009]中国象棋 DP,递推,组合数
DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...
- 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)
Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...
- UVa 926【简单dp,递推】
UVa 926 题意:给定N*N的街道图和起始点,有些街道不能走,问从起点到终点有多少种走法. 很基础的dp.递推,但是有两个地方需要注意,在标记当前点某个方向不能走时,也要同时标记对应方向上的对应点 ...
- 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)
这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...
- HDU 5965 三维dp 或 递推
题意:= =中文题 思路一:比赛时队友想的...然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍. 定义dp[i][j][k],表示第i列, ...
- 51nod 1201 整数划分 dp
1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB 收藏 关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...
- 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模
题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...
- [NOI2017]泳池——概率DP+线性递推
[NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...
- bzoj 3612 [Heoi2014]平衡——整数划分(dp)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 因为力矩的缘故,变成了整数划分. 学习到了整数划分.就是那个图一样的套路.https: ...
随机推荐
- Spring中ApplicationContext加载机制
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp33 加载器目前有两种选择:ContextLoaderListener和Co ...
- 移动端rem使用
let $html=document.documentElement,windowW = window.innerWidth,ratio = windowW / 750if (windowW > ...
- 第1阶段——uboot分析之启动函数bootm命令 (9)
本节主要学习: 详细分析UBOOT中"bootcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0"中怎么实现bootm命令 ...
- Kafka Streams 剖析
1.概述 Kafka Streams 是一个用来处理流式数据的库,属于Java类库,它并不是一个流处理框架,和Storm,Spark Streaming这类流处理框架是明显不一样的.那这样一个库是做什 ...
- JQuery中的表单验证及相关的内容
前 言 JRedu Android应用开发中,经常要用到表单.既然用到了表单,那就不可避免的要用到表单的验证.但是,在提交表单时,但是,并不是,每次提交的表单内容都是正确的,如果 每次都将表单的 ...
- 结对编程四则运算gui
码市地址:https://git.coding.net/linzhao/sizeyunsuangui.git 林 钊 -- 201421123105 吴世荣 -- 201421123119 王坤彬 - ...
- 【Beta】阶段 第一次Daily Scrum Meeting
每日任务 1.本次会议为第一次 Meeting会议: 2.本次会议在周一下午16:40,课间休息时间在禹州楼召开,召开本次会议为10分钟. 一.今日站立式会议照片 二.每个人的工作 (有work it ...
- 201521123114 《Java程序设计》第13周学习总结
1.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu. ...
- PHOTOSHOP常用快捷键大全
PHOTOSHOP常用快捷键大全一.文件新建 CTRL+N打开 CTRL+O 打开为 ALT+CTRL+O关闭 CTRL+W保存 CTRL+S 另存为 CTRL+SHIFT+S另存为网页格式 CTRL ...
- SharePoint备份文件
stp文件:SharePoint的.stp文件 在做一个和SharePoint有关的项目时,由于对SharePoint的unfamiliar,所以客户发了几个后缀为.stp的文件将我纳闷了半天,不 ...