整数划分问题

整数划分是一个经典的问题。
Input
每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n)
Output
对于每组输入,请输出六行。
             第一行: 将n划分成若干正整数之和的划分数。
             第二行: 将n划分成k个正整数之和的划分数。 
             第三行: 将n划分成最大数不超过k的划分数。
             第四行: 将n划分成若干奇正整数之和的划分数。
             第五行: 将n划分成若干不同整数之和的划分数。
             第六行: 打印一个空行。

( 南开nodgd):全是递推题
I: f[i][j]表示i的划分为不超过j个数的划分数,此时分为两种情况: 包括i f[i-j][j]或者不包括i f[i][j-1]  
II: 初始化:i==1 或者j==1 时f[i][j]=1;
第一个f[i][j]表示i的划分为不超过j个数的划分数,f[i][j]=f[i-j][j]+f[i][j-1],最终输出f[N][N]。因为这个子问题元素可以多次使用所以递推的时候要用f[i-j][j]这个状态而不能用f[i-j][j-1]。写代码的时候外层循环j由小到大,内层循环i由小到大。
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]

[j-1][k-1]+f[i][j-1][k])。写代码外层k由小到大,中层j由小到大,内层i由小到大。
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[N][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];
第五个f[i][j]表示把i划分为不超过j的不同数的划分数,f[i][j]=f[i-j][j-1]+f[i][j-1]。外层循环j由小到大,内层i由小到大。显然对于每个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||母函数||递推的更多相关文章

  1. [AHOI2009]中国象棋 DP,递推,组合数

    DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...

  2. 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)

    Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...

  3. UVa 926【简单dp,递推】

    UVa 926 题意:给定N*N的街道图和起始点,有些街道不能走,问从起点到终点有多少种走法. 很基础的dp.递推,但是有两个地方需要注意,在标记当前点某个方向不能走时,也要同时标记对应方向上的对应点 ...

  4. 2014北大研究生推免机试(校内)-复杂的整数划分(DP进阶)

    这是一道典型的整数划分题目,适合正在研究动态规划的同学练练手,但是和上一个随笔一样,我是在Coursera中评测通过的,没有找到适合的OJ有这一道题(找到的ACMer拜托告诉一声~),这道题考察得较全 ...

  5. HDU 5965 三维dp 或 递推

    题意:= =中文题 思路一:比赛时队友想的...然后我赛后想了一下想了个2维dp,但是在转移的时候,貌似出了点小问题...吧?然后就按照队友的思路又写了一遍. 定义dp[i][j][k],表示第i列, ...

  6. 51nod 1201 整数划分 dp

    1201 整数划分 基准时间限制:1 秒 空间限制:131072 KB   收藏  关注 将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2 ...

  7. 【BZOJ4944】【NOI2017】泳池 概率DP 常系数线性递推 特征多项式 多项式取模

    题目大意 有一个\(1001\times n\)的的网格,每个格子有\(q\)的概率是安全的,\(1-q\)的概率是危险的. 定义一个矩形是合法的当且仅当: 这个矩形中每个格子都是安全的 必须紧贴网格 ...

  8. [NOI2017]泳池——概率DP+线性递推

    [NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...

  9. bzoj 3612 [Heoi2014]平衡——整数划分(dp)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 因为力矩的缘故,变成了整数划分. 学习到了整数划分.就是那个图一样的套路.https: ...

随机推荐

  1. js script放在head和body里面的区别

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp66       java script放在head和body的区别   ...

  2. Java缓存类的实际应用场景

    不要着迷于技术,应把注意力放到问题上. 一个普通的后台管理系统,一定会有参数配置.参数配置数据表和其他的数据表是不同的,它的操作基本都是查的操作.参数配置的这些数据信息是贯穿在整个项目中,那么把他们放 ...

  3. 日期时间范围选择插件:daterangepicker使用总结

    分享说明: 项目中要使用日期时间范围选择对数据进行筛选;精确到年月日 时分秒;起初,使用了layui的时间日期选择插件;但是在IIE8第一次点击会报设置格式错误;研究了很久没解决,但能确定不是layu ...

  4. Springboot与Thymeleaf模板引擎整合基础教程(附源码)

    前言 由于在开发My Blog项目时使用了大量的技术整合,针对于部分框架的使用和整合的流程没有做详细的介绍和记录,导致有些朋友用起来有些吃力,因此打算在接下来的时间里做一些基础整合的介绍,当然,可能也 ...

  5. 怎么调用api接口

    api的简单调用,调用api的方法 方法一:用前端方法调用api 完整代码: <!DOCTYPE html> <html lang="en"> <he ...

  6. 201521123062《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...

  7. 201521123004 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 答: 异常的概念上周的思维导图大致体现,这周就归纳一下错误调试 由于多线程的内容比较散,我就直接用文字总结 ...

  8. php中的多条件查询

    首先是查询所有,步骤不详述,连接数据库,查询表中的所有信息,foreach循环以表格的形式打印出来 然后就是form表单中提交查询的数据,这里以post方式提交到本页面,所以要判断post中是否有值, ...

  9. AIX盘rw_timeout值过小导致IO ERROR

    刚下班没多久,接收到告警提示数据库的数据文件异常,且同时收到主机硬盘的IO ERROR告警 该数据库服务器为AIX+oracle 9i环境,登录主机验证关键日志告警 发现确实在18点48分有磁盘IO的 ...

  10. Eclipse rap 富客户端开发总结(8) : 发布到tomcat后解决rap编码和字符集的问题

    1 .解决 rap 字符集乱码的问题 字符集问题,解决办法:   在plugin.xml - build.properties 中添加 javacDefaultEncoding.. = UTF-8   ...