第一题十分经典的问题,我们看出这个问题其实可以从最小规模开始,作为一个整体,每次就只看最大一块圆盘以及上面一坨的移动,若我们用f[i]来表示规模为i时的移动数的话,那么我们只需把上面一坨先利用c移到b上,这要用f[i - 1]的移动次数,再把那最大的圆盘移到c上,最后再利用a把b上的一大坨转移到c上,这又要用f[i - 1]次移动次数。

综上,我们得到递推方程f[i] = f[i -1] * 2 + 1

利用这个方程便可求出答案。

又我们把答案从 1 到 n 列出来,可以发现每一个答案都等于2的x(圆盘数)方 - 1,就可以很直接的写出以下代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
long long x = 1;
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
x *= 2;
}
cout << x - 1;
return 0;

}

就这道题用到了一个问题划分的思想(本蒟蒻的理解方式),研究第一个或第一和第二个骨牌覆盖后剩余的覆盖方案:

我们依然用f[i]来表示当行列数为i时,摆放的方式数。

当i = 1 的时候摆放方式只有一种     i = 0 时纯粹是我们的假象边界,赋值为1.

1、第一个骨牌竖着放:那么这种情况下剩下的格数就是2*(i-1)格,方式数就是f[i - 1]种。

2、第一第二个骨牌都横着放,把第一个4*4的空间给占了:那么现在剩下2*(i - 2)格的空间,方式数就是f[i - 2]种。

那么总问题就应该是f[i] = f[i - 1] + f[i - 2] 啦!

实际上就是斐波拉契数列

这样我们可以写出:

#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
long long a[55]; 
int main()
{
int n;
cin >> n;
a[0] = a[1] = 1;
for(int i = 2;i <= n;i++)
{
a[i] = a[i-1]+a[i-2];
}
cout << a[n];
return 0;

}

代码十分简单,但是理解的话本蒟蒻还是觉得站在蒟蒻的角度是不太好理解的。

一道状态转移的题

总而言之意思就是每个人可以传给旁边的俩人,可以传的次数为m,人数为n,就相当于一个圈,向左或向右传。

那么我们可以定状态为:f[i][j] 意为经j次传递传到i编号处的人时的总方案数。

因为成圈型结构,我们肯定要求模,所以从0开始计数。

边界有两个:

f[0][0] 当传递次数为 0 时传到 0号(也就是小蛮时)方案数为1

f[i][0] (i != 0)  //当传递不了而球又不在小蛮手上时,方案数为0.

某位置的方案数应该等于从左传到右加上从右传到左的方案总和,所以如下:
    f[i][j] = f[(i - 1 + n) % n][j - 1] + f[(i + 1) % n][j - 1];

代码:

#include<bits/stdc++.h>
using namespace std;
long long f[35][35];
int main()
{
int n,m;
cin >> n >> m;
f[0][0] = 1;//边界,当传递次数为 0 时传到 0号(也就是小蛮时)方案数为1 
for(int i = 1;i < n;i++)
{
f[i][0] = 0;//当传递不了而球又不在小蛮手上时,方案数为0. 
}
for(int j = 1;j <= m;j++)
{
for(int i = 0;i < n;i++)
{
f[i][j] = f[(i - 1 + n) % n][j - 1] + f[(i + 1) % n][j - 1]; 
}//f[i][j]表示当传递次数为j时传到i号时的方案数。
}
cout << f[0][m]; 
return 0;

}

这道题首先我们看到给出n个球,r个盒子,并且每个盒子都得有东西。

那么要解决这道题我们可以定义状态:

f[i][j] 表示当放球编号(也就是数量啦这道题中的话)为i放入了j个盒子·时所有的方案数

这样边界便可直接得出:

1、当盒子只有一个时(j == 1),我们只有一种放的方式,就是全部放进去。当球数和盒子数一样时(i == j),由于不能空盒,则只能一个盒子放一个,所以方案数也为1。

2、当球数小于盒子数时(i < j),由于不能有空盒,所以这样的方案数为0。

状态转移则需对任一编号球放入某盒子做分析:

1、当第i个球独自占有第j个盒子时,其他球放的方案就为f[i - 1][j - 1]

2、当第i个球和其他某些球一起在某盒子里时,由于放入盒子是随机的,则就有j种可能,所以此时方案数为f[i - 1][j]*j。

所以说代码如下:

#include<bits/stdc++.h>
using namespace std;
long long f[25][25];

int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(j == 1 || i == j)
{
f[i][j] = 1;
}
else{
if(i < j)
f[i][j] = 0;
else {
f[i][j] = f[i - 1][j - 1] + f[i - 1][j]*j;
}

}

}

}
cout << f[n][m];
return 0;
}

错排:

是一道简单的代码,坑爹的推导过程的一道题。

如果你够厉害的话,可以直接把规律方程写出来,那么你这道题就AC了。

0 1 2 9 44 。。。。。(加油)

但本蒟蒻是没有做到的,于是乎我们就开始分析吧。

定义状态为:f[i]当人数为i时的方案数。

这道题边界是:

1、一个人时,不能交换,方案数为0。

2、俩人时,只能互相交换,方案数为1.

对某个同学x给一号同学书分析:

1、他刚好给了1号同学,一号同学的书也可以说给了他(毕竟x是随机某一个,我们可以就定为1号同学给的那个嘛),那么此时剩下i-2个人要互相交换书,方案数为f[i - 2]。

2、他没能给到1号同学,但我们可以假设一号同学把书给了他,理由同上,那么此时还有i - 1个人要互相交换书,所以方案数为f[i - 1]。

但要知道我们的x同学是任一同学,那么x的可能就有(i - 1)种(因为给了一号同学书,一号不可能为x),所以总方案数要乘以一个(i - 1)。

代码如下:

#include<bits/stdc++.h>
using namespace std;
long long f[25];
int main()
{
int n;
cin >> n;
f[1] = 0;
f[2] = 1;
for(int i = 3;i <= n;i++)//状态是i本书时的排列方式总数,
//看的是一本书交换后的两种情况之和
{
f[i] = (i - 1)*(f[i - 1] + f[i - 2]);
}
cout << f[n];
return 0;
 }

就特简单,就让人觉得推理过程可怕。

接下来转到卡特兰数环节!

2月12日 模拟题 递推 题解相关推荐

  1. 10月9日模拟题解题报告

    PS:昨天月考,极其恶劣的成绩,结果李总在伤口上给我们撒盐,今天搞了个模拟赛--- 1.期末考试 finaltest.cpp/c/pas 1s / 128M [题目描述]  山山同学在期末考试前向他妈 ...

  2. 重走长征路---OI每周刷题记录---4月12日 2015

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  3. 任天堂推出《塞尔达传说》GAMEampWATCH游戏机,预计要在 2021 年 11 月 12 日推出塞尔达版本的 GAMEampWATCH

    模玩资讯:任天堂推出<塞尔达传说>GAME&ampWATCH游戏机 任天堂将自家起底基业商品GAME&ampWATCH结合招牌游戏有奇效!继去年此时推出<超级玛利欧兄 ...

  4. 互联网晚报 | 8月12日 星期四 | 苏宁易购零售云将迈入“万店时代”;理想汽车今日港股上市;好未来励步推素质教育新产品...

    今日看点 ✦ 国务院教育督导办:对各地落实"双减"情况建立半月通报制度 ✦ 恒大回应出售恒大汽车:考虑出售旗下部分资产,并非整体出售 ✦ 理想汽车:港股IPO募资约115.5亿港元 ...

  5. ACwing算法基础课全程笔记(2021年8月12日开始重写+优化)

    更好的阅读体验 ※基础模板 2021年8月12日开始对基础课笔记进行重写+优化 请大家支持AcWing正版,购买网课能让自己获得更好的学习体验哦~ 链接:https://www.acwing.com/ ...

  6. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月5日-8月12日)

    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月5日-8月12日) 本周Silverlight学习资源更新 Silverlight设计时特性的使用 _eagle S ...

  7. 【历史上的今天】10 月 12 日:C 语言之父逝世;西门子诞生;乔布斯推出 NeXT 电脑

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 10 月 12 日,历史上的这一天,哥伦布发现了"新大陆",在他发现的这片美洲上 ...

  8. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(3月12日-3月18日)

    分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(3月12日-3月18日) 本周Silverlight学习资源更新 Silverlight实用窍门系列:58.Si ...

  9. 【历史上的今天】11 月 12 日:USB 3.0 发布;图灵机论文被发表;TinyOS 创作者诞生

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 11 月 12 日,在 112 年前的今天,我国著名数学家华罗庚先生诞生,他也是中科院院士,清华大学 ...

  10. php迪士尼4_每日新闻摘要,19/4/12:迪士尼+将于11月12日登陆,每月$ 6.99

    php迪士尼4 Plus Facebook might roll Messenger back into the main mobile apps, Acer announced a slew of ...

最新文章

  1. 分布式实物实现方式_这是您完成实物产品设计任务的方式
  2. python3 递归
  3. js实现文字从右滚动到左边代码循环滚动实例
  4. 两大流量“黑洞”联姻了:让你在支付宝上刷微博,在微博上用支付宝买单
  5. DFS序--树的问题转化为区间问题
  6. java main usage_java-一个简单的访问DB的main方法使用 | 学步园
  7. mysql中替代 =_SELECT * WHERE var == [MySQL中的许多替代方法之一]?
  8. 高边电流检测测量:电路和原理
  9. 在架构师眼里,一份美团外卖是如何做出来的?
  10. 计算机专业买笔记本有什么要求,笔记本电脑什么配置好?硬核选购指南来了!...
  11. python读word文档计算字数_python读取word文档
  12. 阿里云视频云推出低代码音视频工厂vPaaS
  13. 80道前端面试经典选择题
  14. HTML5表单:工具箱中的可靠工具
  15. the rode to success
  16. 移动自带的光猫带无线路由功能,用不用关掉,用光猫的路由拨号还是自备的路由器拨号?
  17. (已更新)柒微自动发卡系统源码
  18. WP篇 创新实践能力赛(华东南分区赛)线下AWD复现
  19. m基于Simulink的高速跳频通信系统抗干扰性能分析
  20. 阿里云MQTT服务器搭建

热门文章

  1. 电脑格式化之后如何进行数据恢复【图文教程】
  2. Ubuntu Debian(NGINX/PHP/MYSQL)快速配置工具LNMP云安装
  3. 使用ArcGIS实现地貌晕渲
  4. AT32F407/437 PTP Daemon使用demo
  5. 淘宝系一天交易额超52亿 电商光棍节疯狂吸金
  6. oracle12c 日志分析,【案例】Oracle 12C日志大量Resize operation completed for file信息
  7. springboot1.5.x+ seata1.4.2(最新版本)+springcloud ( Edgware.SR5) +eureka+feign+mybatis-plus(最新)
  8. 2106_视频处理与压缩技术_中文综述
  9. 记一次nginx配置服务器代理发送请求(外网请求内网ip)
  10. hive on spark : 使用load data 命令将hdfs上数据覆写到hive表中报错:could not be cleaned up解决方法