大概是:整数划分||DP||母函数||递推
整数划分问题
整数划分是一个经典的问题。
Input
每组输入是两个整数n和k。(1 <= n <= 50, 1 <= k <= n)
Output
对于每组输入,请输出六行。
第一行: 将n划分成若干正整数之和的划分数。
第二行: 将n划分成k个正整数之和的划分数。
第三行: 将n划分成最大数不超过k的划分数。
第四行: 将n划分成若干奇正整数之和的划分数。
第五行: 将n划分成若干不同整数之和的划分数。
第六行: 打印一个空行。
( 南开nodgd):全是递推题
第一个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]
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];
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||母函数||递推相关推荐
- HD 2048 数塔 DP(简单递推)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这 ...
- 【牛客 - 1080E】tokitsukaze and Segmentation(dp,递推,思维)
题干: 链接:https://ac.nowcoder.com/acm/contest/1080/E 来源:牛客网 tokitsukaze有一个长度为n的字符串,字符串仅包含'0'-'9'. tokit ...
- (C语言)整数划分问题 递归和递推
题目内容: 对于一个正整数n的划分,就是把n变成一系列正整数之和的表达式.注意,分划与顺序无关,例如6=5+1跟6=1+5是 同一种分划.另外,单独这个整数本身也算一种分划. 例如:对于正整数n=5, ...
- 【牛客 - 315F】美丽的项链(线性dp,递推,我为人人)
题干: 妞妞参加了Nowcoder Girl女生编程挑战赛, 但是很遗憾, 她没能得到她最喜欢的黑天鹅水晶项链. 于是妞妞决定自己来制作一条美丽的项链.一条美丽的项链需要满足以下条件: 1.需要使用n ...
- UESTC 1726 整数划分(母函数)
题目链接:http://222.197.181.5/problem.php?pid=1726 题意:求n的划分数.一种划分方案中不能有相同的数字. 思路:(1+x)(1+x^2)(1+x^3)--(1 ...
- UVa 10934 Dropping water balloons:dp(递推)
题目链接:https://vjudge.net/problem/27377/origin 题意: 有一栋n层高的楼,并给你k个水球.在一定高度及以上将水球扔下,水球会摔破:在这个高度以下扔,水球不会摔 ...
- 概率DP,递推(麻球繁殖,UVA 11021)
能想到是概率DP,但是定义状态dp[i][j]第i天剩j个麻球.然后麻球数量可能会繁殖到非常多,状态太多数组开不下,然后就不会了. 感觉自己总是轻易就放弃了,还是应该再思考一下,一般遇到这种想到DP但 ...
- 【递推】常见的递推关系
背景: 基于对于昨天的考试暴毙的反思就写了这篇博客,总结之前所有学过的递推关系以及一些比较有常见的数列,这其实就是针对于 T1T1T1 的出题范围,很有可能是这些公式的简单应用.所以就把它们打个包直接 ...
- 面相对象的topSort和递推【ural1022/ural1017】
面向对象是个好东西,他可以使责任分立,于是我尝试着在ural1022里面使用了这个思想来实现拓扑排序,很幸运的一次AC. 以节点为对象,他的责任有: 1 操作自身划入另一个集合 2 操作子节点入度减一 ...
最新文章
- nacos 本地测试_微服务架构系列之Nacos 配置核心概念
- Nginx负载均衡策略之least_conn
- tf调不到keras怎么 回事_拼多多刷单关键词搜不到是怎么回事?如何解决?
- Leetcode 456. 132 Pattern
- Oracle自定义类型
- MySQL基础2——表的约束
- Linux:cpufreq
- interpolation algorithm
- vscode设置背景图片
- 律动荆棘皇冠 Crown of Thorns
- 计算机设备管理cmd命令,打开设备管理器的命令,教你一分钟学会最简单
- coffeescript java 执行_CoffeeScript—面向对象
- 图片转PDF格式怎么弄?我来教你几个方法
- 彻底解决python关于各种文件(音乐、视屏等)读写的操作
- SQL16号统计1~15号数据,1号统计上月15~月底数据
- LaTeX公式符号总结(Markdown适用)
- 一个动画看懂网络原理之CSMA/CD的工作原理
- Hadoop MapReduce编程 API入门系列之查找相同字母组成的字谜(三)
- oracle 8i 中文转拼音
- u盘启动linux出现grub,通过U盘为Ubuntu更新GRUB恢复系统引导的教程