刷题向》DP》放苹果 (normal)
这篇博客可能字数比较多,而且很难讲清楚,我会努力给你们讲清楚;
首先,放苹果是一道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)的更多相关文章
- HDU5697 刷题计划 dp+最小乘积生成树
分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog ...
- LeetCode刷题笔记-DP算法-取数问题
题目描述 (除数博弈论)爱丽丝和鲍勃一起玩游戏,他们轮流行动.爱丽丝先手开局. 最初,黑板上有一个数字 N .在每个玩家的回合,玩家需要执行以下操作: 选出任一 x,满足 0 < x < ...
- 【递归】P2386放苹果
题目相关 题目描述 把 m个同样的苹果放在 n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法.(5,1,1 和 1,1,5 是同一种方法) 输入格式 第一行是测试数据的数目 t,以下每行 ...
- [DP题]放苹果
放苹果(DP做法) 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入第一行是测试数据的数目t(0 < ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- DP刷题记录(持续更新)
DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...
- 【noi 2.6_666】放苹果 & 【noi 2.6_8467】鸣人的影分身(DP)
这题其实在2.6前面的专题也有出现过,我还以为我有写,结果发现,并没有.于是就现在写了.这2题其实重复了......我就按放苹果的来说. 题意:把N个苹果放在M个盘子里,允许有的盘子空着不放,问共有多 ...
- OpenJudge 666:放苹果 // 瞎基本DP
666:放苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1 ...
- 放苹果问题 DP计数 m个苹果放在n个盘子里,苹果,盘子相同,盘子可为空
详细的解释放苹果问题的链接:苹果可相同可不同,盘子可相同可不同,盘子可空和不可空,都有详细的说明··· http://www.cnblogs.com/celia01/archive/2012/02/1 ...
随机推荐
- OneDrive网页版打不开的解决办法
发现OneDrive文件被误删了,想去网页版找回历史文件,发现网页版无法打开,而客户端是可以正常使用的,于是猜测是域名指向的主IP被封了,于是想通过客户端的IP访问 第一步,WireShark抓包 第 ...
- Linux 下spark安装
一.安装前提: 1.java环境(jdk1.8) 2.scala环境(2.0) 3.python 环境(3.5) :注如果使用pyspark的话,这个才是必须的. 二.spark安装 在官网下载安装 ...
- 随机获取图片的api接口
http://lorempixel.com/1600/900 https://unsplash.it/1600/900?random(国内加载略慢) https://uploadbeta.com/ap ...
- 简述MVC模式
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- python中的单元测试pyUnit
python中的单元测试pyUnit 在Python中进行单元测试时需要用到PyUnit模块,Python 2.1及其以后的版本都将PyUnit作为一个标准模块,但如果你使用的是较老版本的Pyth ...
- javascript的八张思维导图
出处:http://www.cnblogs.com/junhey/p/4292683.html
- yield关键字用法与解析(C# 参考)
yield 关键字向编译器指示它所在的方法是迭代器块. 编译器生成一个类来实现迭代器块中表示的行为. 在迭代器块中,yield 关键字与 return 关键字结合使用,向枚举器对象提供值. 这是一个返 ...
- Maven依赖调解
引用来自maven实战中的一段话.
- 省略名词: 从 Please find the attached 说起
为什么是attached 首先需要解释的,为什么是叫attached: When you would like a person to reference a document attached to ...
- Crypto 加密解密
import binascii from Crypto.Cipher import AES #秘钥,此处需要将字符串转为字节 from utils import config from utils.e ...