【放苹果(题解)】
来源:互联网 发布:淘宝200多的智能机 编辑:程序博客网 时间:2024/05/29 07:35
【原题在此】
如果将题目简化,则如下:将一个正整数m化成n个非负整数的和,求出所有的方案。
所以,思考的重点应放在状态转移上。
首先尝试用一维状态定义f[ ]——发现状态难以转移;
然后在原基础上加上一维,即f[ ][ ]——选取一种合适的状态:
f[i][j]表示i个苹果放在j个盘子中的放法数(注意:不是第i个第j个)
为方便理解,接下来是找规律的过程:(例子是:把6个苹果放在3个盘中)
如果我们天真地认为,f[i][j]仅仅由一个状态转移而来,那么:
我们可以快乐地设:f[i][j]=g(f[某][某]) ( g()为某种函数 )
所以我会想:f[i][j]会不会由f[i][j-1]通过g()函数转移过来?
首先我们看一下这个过程的实际含义:
“要把i个果果放到j个盘子中的放法数”与“把i个果果放入(j-1)个盘子中的放法数”是否有某种转移关系。
乍一看,二者绝对有关系,不过后者不能构成完整的前者:
即f[i][j-1]不可以直接继承(或简单的通过某种运算得到)f[i][j]。
所以我们需要再做改变或补充:
现在我们开心地认为,f[i][j]仅仅由2个状态转移而来,那么:
我们可以兴奋地设:f[i][j]=g1(f[某][某])+g2(f[xxx][xxx]) ( g1()g2()均为某种函数 )
那么通过上面的图片,可以看出这个状态(f[6][3])可以分为这两部分构成:
①第三个盘子没有放苹果的放法数——即第三个数是“0”(共计3个)
② 第三个盘子放了苹果的放法数——及第三个数不为“0”(共计3个)
说明:f[6][3]它是可以拆成以下两部分的(即由两种状态所转移得到):
所以,张姐,由上图红圈和黄圈所划分的两部分可以得出结论:
f[ i ][ j ] =f[ i ][ j-1]+f[ i-j ][ j ]
至此,本题核心问题已解决,剩下的问题还有两点:
(1)预处理(2)递归式和递推式的转换
代码可以告诉你一切:
圆满结束。如果您有什么问题或是发现了纰漏,请在评论里表达意愿,我会及时作出调整和补充。
这只是数学排列组合方面的一道开胃菜,征服这个领域的旅途才刚刚开始!Fighting!
- 【放苹果(题解)】
- 放苹果题解
- openjudge666:放苹果—题解
- POJ 1664放苹果题解
- 放苹果(递归)
- 放苹果(递归)
- 放苹果(递归)
- poj1664 放苹果(递归)
- poj1664 放苹果(递归)
- 华为OJ(放苹果)
- POJ-放苹果(DP)
- POJ1664 放苹果(递归)
- poj1664 放苹果(递归)
- 1018:放苹果(递归)
- POJ1664(递归,放苹果)
- 放苹果问题(递归)
- 2072: 放苹果(dp)
- 放苹果
- dpdk多进程示例解读(examples/multi_process/simple_mp)
- 虚拟机中的ubuntu怎么设置1920X1080分辨率
- Python包管理:pip、easy_install、eggs和wheel
- Linux内核中的fastcall和asmlinkage宏
- 斐波那契数列和青蛙跳问题
- 【放苹果(题解)】
- JAVA中关于List集合和map集合之间的继承关系
- C#语法小知识(十八)const与readonly
- 文件描述符fd和文件指针fp之间的相互转换
- 输出数组中所有三个数相加为0的解
- HTML 3 元素和属性
- 从一个字符数组中读出相应的整数、实数
- Linux编程之线程介绍
- VS中设置#define _CRT_SECURE_NO_WARNINGS的两种方式