HDOJ(HDU).2044-2049 递推专题
HDOJ(HDU).2044-2049 递推专题
HDU.2044
题意分析
先考虑递推关系:从1到第n个格子的时候由多少种走法?
如图,当n为下方格子的时候,由于只能向右走,所以有2中走法。当n为上方格子的时候,由于只能向右走,所以也有2种走法。
不妨用a[n]来表示第n个格子有几种走法,根据上述描述,不难找出递推关系,a[n] = a[n-1] + a[n-2]。但是对于n<2的数字,就不适用了。也很简单,n<2的时候数一下即可,从1走到1,只有一种走法,从1走到2,有一种走法。问题就解决了。
然后我们接着考虑从b走到c有几种走法。不放就看样例给的3-6。从图中可以看出,从3-6走的方法和从1-4走的方法总数是一样的。故从b到c的的方法数为a[c-b+1].
代码总览
/*
Title:HDOJ.2044
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[51];
int main()
{
a[1] = a[2] = 1;
for(int i = 3 ; i<=50 ;++i) a[i] = a[i-1] + a[i-2];
int b,c,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&b,&c);
printf("%lld\n",a[c-b+1]);
}
return 0;
}
HDU.2045
题意分析
由于前一个颜色的选择会影响到下一个颜色的选择,对于前n个格子的涂法,就要对前n-1个格子的颜色进行分析。由于要求是首位的颜色不同,那么就要对第n-1个格子是否与第一个格子颜色相同分类讨论。a[n]代表前n个格子的涂法。
若第一个格子与第n-1个格子的颜色不同,那么第n个格子的就有1种涂法;若第n-1个格子与第一个格子颜色相同,那么第n个格子就有2种涂法,需要注意的是,其实这种情况的方案数是与a[n-2]有关的,因为此时方案数是a[n-2] * 1 * 2 (n-1格子颜色已经确定了)
代码总览
/*
Title:HDOJ.2045
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[51];
int main()
{
a[1] = 3; a[2] = 6; a[3] = 6;
for(int i = 4; i<=50; ++i) a[i] = a[i-2]*2 + a[i-1];
int n;
while(scanf("%d",&n) != EOF){
printf("%lld\n",a[n]);
}
return 0;
}
HDU.2046
题意分析
代码总览
/*
Title:HDOJ.2046
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[51];
int main()
{
a[1] = 1; a[2] = 2;
for(int i = 3; i<=50; ++i) a[i] = a[i-2] + a[i-1];
int n;
while(scanf("%d",&n) != EOF){
printf("%lld\n",a[n]);
}
return 0;
}
HDU.2047
题意分析
由于n-1位是否为O,影响第n位的选择,所以很明显,这道题有2种状态,一种是n-1是O,一种是n-1不是O。第n位的方案数就是,n为O的方案 + n不为O的方案。
a[n]表示O结尾的方案数 b[n]不是以O结尾的方案数,c[n]表示总的方案数。那么c[n] = a[n] + b[n]。
不难发现:
a[1] = 1; a[2] = 2; c[1] = 3;
b[1] = 2; b[2] = 6; c[2] = 8;
然后分别找一下a[n]和b[n]的递推关系式:
由于不能有O相连,那么n-1不为O的时候,n位才有可能为O,可以得出:a[n] = b[n-1];
接着考虑什么时候第n位为非O呢,当第n-1位是O的时候,n可能有EF2种非O选择,当n-1位为O的时候,也有EF2种非O选择,于是有:b[n] = 2 * (a[n-1] + b[n-1])
有了ab的递推关系式,根据c[n] = a[n] + b[n] 问题也就迎刃而解了。
代码总览
/*
Title:HDOJ.2047
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[41],b[41],c[41];
int main()
{ // a以O结尾的结果数量 b非以O的数量
a[1] = 1; a[2] = 2; c[1] = 3;
b[1] = 2; b[2] = 6; c[2] = 8;
for(int i = 3; i<=40; ++i){
a[i] = b[i-1];
b[i] = 2*(a[i-1] + b[i-1]);
c[i] = a[i] + b[i];
}
int n;
while(scanf("%d",&n) != EOF){
printf("%lld\n",c[n]);
}
return 0;
}
HDU.2048
题意分析
此题的递推关系体现在错排公式,详情百度。
代码总览
/*
Title:HDOJ.2048
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[21]={0,0,1},b[21] = {0,1};
ll cal(int i)
{
if(b[i] != 0) return b[i];
else return (cal(i-1)*i);
}
void init()
{
for(int i = 1;i<=20;++i)
b[i] = cal(i);
for(int i = 3; i<=20;++i)
a[i] = (i-1) * (a[i-1]+a[i-2]);
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
printf("%.2f%%\n",100.0*a[n]/b[n]);
}
}
HDU.2049
题意分析
此题的递推关系体现在错排公式,详情百度。
代码总览
/*
Title:HDOJ.2049
Author:pengwill
Date:2017-2-13
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
ll a[21]={0,0,1},b[21] = {1,1};//a是错排,b是全排列
ll cal(int i)
{
if(b[i] != 0) return b[i];
else return (cal(i-1)*i);
}
void init()
{
for(int i = 1;i<=20;++i)
b[i] = cal(i);
for(int i = 3; i<=20;++i)
a[i] = (i-1) * (a[i-1]+a[i-2]);
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
printf("%lld\n",b[n]/b[m]/b[n-m] * a[m]);
}
}
HDOJ(HDU).2044-2049 递推专题的更多相关文章
- 致初学者(四):HDU 2044~2050 递推专项习题解
所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定.关于递推的知识可以参阅本博客中随笔“递推 ...
- hdu 2044-2050 递推专题
总结一下做递推题的经验,一般都开成long long (别看项数少,随便就超了) 一般从第 i 项开始推其与前面项的关系(动态规划也是这样),而不是从第i 项推其与后面的项的关系. hdu2044:h ...
- <每日一题> Day6:HDU递推专题完结
原题链接 这是我自己Clone的专题,A,B题解昨天发过了 C:参考代码: /* 很容易我们可以手推出n = 1, 2, 3时的情况,我们假设前n - 1 列已经放好,方法有dp[n - 1]种,第n ...
- 一只小蜜蜂(hdoj 2044,动态规划递推)
Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数.其中,蜂房的结构如下所示. Input 输入数据的第一行 ...
- HDU 4747 Mex 递推/线段树
题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...
- HDU 2604 Queuing(递推+矩阵)
Queuing [题目链接]Queuing [题目类型]递推+矩阵 &题解: 这题想是早就想出来了,就坑在初始化那块,只把要用的初始化了没有把其他的赋值为0,调了3,4个小时 = = 本题是可 ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1723 DP/递推
题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...
- hdu 1249 三角形 (递推)
三角形 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
随机推荐
- Selenium(Python) ddt数据驱动
首先, 添加ddt模块: import unittestfrom time import sleep from ddt import ddt, data, unpack# 导入ddt模块from se ...
- Web自动化测试环境搭建1(基于firefox火狐浏览器)
自动化测试是时代趋势,因此很多测试人员开始研究自动化测试,web自动化测试化测试并不难,但是很多人都是被挡在了环境搭建这一步,后面学习激情全无,这里,韬哥手把手教大家搭建火狐浏览器下的自动化测试环境( ...
- 【view】 视图组件说明
view 是视图容器,可用于包裹其它组件或文本内容. 原型: <view hover-class="[String]" hover-stop-propagation=&quo ...
- Java并发基础--ThreadLocal
一.ThreadLocal定义 ThreadLocal是一个可以提供线程局部变量的类,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,通过为每个线程提供一个独立的变量副本解决了变量 ...
- python3 SQLAlchemy模块使用
更详细的操作介绍:https://www.imooc.com/article/22343 定义: SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对 ...
- bootstrapValidator.js,最好用的bootstrap表单验证插件 简单实用方法
实用方法 1.引入 在有jquery和bootstrap的页面里引入bootstrapValidator.js和bootstrapValidator.css文件 2. 按照bootstrap的表单组件 ...
- string && 字符数组
一.string 1. 使用字符串字面值初始化string对象 如:string s1 = "hiya"; string s2("hiya"); 该字面值的最后 ...
- 第三次寒假作业 sketch 了解
什么是sketch? sketch 是一种基于散列的数据结构,可以在高速网络环境中,实时地存储流量特征信息,只占用较小的空间资源,并且具备在理论上可证明的估计精度与内存的平衡特性. 通过设置散列函数, ...
- iOS- 网络访问JSON数据类型与XML数据类型的实现思路及它们之间的区别
1.JSON (基本上移动开发的主要数据传输都是JSON) 1.1.JSON特点: a.[] 表示数组 b.{} 表示字典 - 对象模型建立关系 c.应用非常多,基本上移动开发的主要数据传输都是JSO ...
- 基于gulp的前端自动化开发构建新
关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题.问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记.每次更新标记更新. 上篇文章想通过开发同时实现标记的实时更新, ...