这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚;

首先,放苹果是一道DP,之所以难,是因为很难想到,我的确有同学用三维数组做出来,然而三维的的确比二维好理解,但三维复杂度太高,虽然DP一般数据都给的不大,但复杂度低的算法才是好算法,所以接下来我会给讲一个二维的放苹果的思路;

首先,我们用f[i][j]来代表i个苹果放在j个盘子里,然后就可以推知当i=1或i=0或j=1时f[i][j]=1;

当然,这是必然的;

那么对于复杂的f[i][j]我们可以推知:当盘子数大于苹果数的时候,一定是有盘子装不满的,所以,f[i][j]=f[i][i];

对于苹果数大于盘子数的情况,我们可以考虑f[i][j]从两种情况转移来,一种是有空盘子的情况,另一种是没有空盘子的情况,题目要求是要考虑两种情况,所以f[i][j]只要从两种情况转移过来就好,那么,动态规划的基本思想就是:从当前算过的情况转移过来,所以我们要把对于当前f[i][j]的有空盘子情况用算过的f[i][j]来表示,同理,我们也要用算过的f[i][j]来表示没有空盘子的情况;

由于程序里我的f[i][j]中的i和j是递增来算的,所以,在我们算f[i][j]时,对于f数组的横纵坐标小于当前i,j的情况我们是已经算过的;

所以我们考虑,对于苹果数大于盘子数的f[i][j],没有空盘子就是每个盘子至少有一个苹果的情况,那么每个盘子都有一个苹果,也就是说这些苹果不参与移动,所以我们便可以从f[i-j][j]的情况转移过来,因为对于当前情况,f[i-j][j]是算过的,代表在j个盘子里,只有i-j个苹果可以移动,这就是没有空位的情况;

那么,对于有空盘子的情况,我们可以直接从f[i][j-1]转移过来,原因很简单,因为对于f[i][j-1]来说,我们也考虑过f[i][j-2]的情况,f[i][j-2]是对于f[i][j-1]的空一个盘子的情况,也是对于f[i][j]的空两个的情况,由此递推下去,我们可以的得到空1到空j-1的个盘子的情况,当j==1时,我们就可以得到1,那么一层一层递推上来,就可以得到f[i][j-1];

最后一步,我们只需要把f[i][j-1]+f[i-j][j]就可以得到f[i][j];

以下是附加程序//我觉得我已经讲得够清楚了,应该不用看代码就可以自己写出来

ps1:以上文字还没看懂的去面壁好吗

PS2:这是我在noi.openjudge.cn里A的程序

 #include<stdio.h>
int T,f[][],n,m;
int main()
{
scanf("%d",&T);
for(int i=;i<=;i++)
f[][i]=;
for(int i=;i<=;i++)
{f[][i]=;f[][i]=;}
for(int i=;i<=;i++)
{f[i][]=;f[i][]=;}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
{
if(i>=j)f[i][j]=f[i][j-]+f[i-j][j];
else f[i][j]=f[i][i];
}
while(T--)
{
scanf("%d%d",&m,&n);//苹果M,盘子N
printf("%d\n",f[m][n]);
}
return ;
}

刷题向》DP》放苹果 (normal)的更多相关文章

  1. HDU5697 刷题计划 dp+最小乘积生成树

    分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...

  2. LeetCode刷题笔记-DP算法-取数问题

    题目描述 (除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < ...

  3. 【递归】P2386放苹果

    题目相关 题目描述 把 m个同样的苹果放在 n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法.(5,1,1 和 1,1,5 是同一种方法) 输入格式 第一行是测试数据的数目 t,以下每行 ...

  4. [DP题]放苹果

    放苹果(DP做法) 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 < ...

  5. $2019$ 暑期刷题记录1:(算法竞赛DP练习)

    $ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...

  6. DP刷题记录(持续更新)

    DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...

  7. 【noi 2.6_666】放苹果 & 【noi 2.6_8467】鸣人的影分身(DP)

    这题其实在2.6前面的专题也有出现过,我还以为我有写,结果发现,并没有.于是就现在写了.这2题其实重复了......我就按放苹果的来说. 题意:把N个苹果放在M个盘子里,允许有的盘子空着不放,问共有多 ...

  8. OpenJudge 666:放苹果 // 瞎基本DP

    666:放苹果 总时间限制:  1000ms     内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1 ...

  9. 放苹果问题 DP计数 m个苹果放在n个盘子里,苹果,盘子相同,盘子可为空

    详细的解释放苹果问题的链接:苹果可相同可不同,盘子可相同可不同,盘子可空和不可空,都有详细的说明··· http://www.cnblogs.com/celia01/archive/2012/02/1 ...

随机推荐

  1. golang日期转字符串,仿照C#中的日期格式结构体

    1.日期格式集合.日期转字符串方法 package util import ( "strings" "time" ) //日期格式:模仿java中的结构体 ty ...

  2. 【整理】石子合并问题(四边形不等式DP优化)

    有很多种算法: 1,任意两堆可以合并:贪心+单调队列. 2,相邻两堆可合并:区间DP    (O(n^3)) ). 3,相邻,四边形不等式优化DP (O(n^2) ). 4,相邻,GarsiaWach ...

  3. browser-sync 服务器使用

    1. 安装 npm install browser-sync or yarn add browser-sync 2. 使用(集成gulp) 备注: gulp 安装使用此处不介绍 默认的端口是3000, ...

  4. 深入学习Web Service系列----异步开发模式

    概述 在本篇随笔中,通过一些简单的示例来说一下Web Service中的异步调用模式.调用Web Service方法有两种方式,同步调用和异步调用.同步调用是程序继续执行前等候调用的完成,而异步调用在 ...

  5. (转)Android和JavaScript互相调用

    Html页面和Java代码结合的方式一般用在界面经常被更改 的情况下,可以讲html放在网络中,软件一打开就会访问网络获取到最新的界面.缺点是会受到网络信号的影响,从而导致访问速度慢. 1.用WebV ...

  6. spring mvc集成freemarker使用

    freemarker作为视图技术出现的比velocity早,想当年struts风靡一时,freemarker作为视图层也风光了一把.但现在velocity作为后起之秀的轻量级模板引擎,更容易得到青睐. ...

  7. 1、python基础速成

    基础模块 def prt(age,name):#函数定义 print("%s is %d 年龄 old"%(name,age)) if __name__=="__main ...

  8. laravel前后端分离的用户登陆 退出 中间件的接口与session的使用

    在项目开发的过程中,需要有用户的登陆 退出 还有校验用户是否登陆的中间件; 基本思路: 登陆: 前端请求接口的参数校验 用户名 密码规则的校验 用户名密码是否正确的校验; 如果上面的校验都通过的了,把 ...

  9. FPGA噪声干扰

    在FPGA高速AD采集设计中,PCB布线差会产生干扰.今天小编为大家介绍一些布线解决方案. 1.信号线的等长 以SDRAM或者DDRII为例,数据线,命令线,地址线以及时钟线最好等长,误差不要超过50 ...

  10. FTP mget without prompt

    # ftp 192.168.100.2Connected to 192.168.100.2.220 Microsoft FTP ServiceName (192.168.100.2:root): ja ...