刷题向》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 ...
随机推荐
- Ubuntu安装最新版的nodejs
安装玩Ubuntu的虚拟机之后安装nodejs发现npm的版本才3.5.2,这都多老了?于是Google了一下,发现是由于Ubuntu官方维护的包源太老了,想要安装nodejs的最新版,两种方法,一种 ...
- ORM 关键
1. 老师的增删改查 1. teacher_obj.cid.add(*[1, 2, 3]) 添加(必须打散) 2. teacher_obj.cid.set([1, 2, 3]) 设置(不用打散) 2. ...
- Laraver 框架资料
重定向: return redirect()->to('http://www.baidu.com'); 重定向到内部路由 return redirect()->route(‘name’); ...
- HDU - 5088: Revenge of Nim II (问是否存在子集的异或为0)
Nim is a mathematical game of strategy in which two players take turns removing objects from distinc ...
- make命令和makefile文件
make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具,它不仅常被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录. makefile文件由一组依赖关系 ...
- RabbitMQ学习系列四-EasyNetQ文档跟进式学习与实践
EasyNetQ文档跟进式学习与实践 https://www.cnblogs.com/DjlNet/p/7603554.html 这里可能有人要问了,为什么不使用官方的nuget包呐:RabbitMQ ...
- Android进程间的通信
1.概述:由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于 ...
- Linq:从XML获取数据
实体类 public class Customer { public string CustomerID { get; set; } public string CompanyName { get; ...
- 调用 SSPI 失败,请参见内部异常 解决方法
2017-11-12 12:49:53:706] OnServerConnectionAvailable error : System.Security.Authentication.Authenti ...
- bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...