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 ...
随机推荐
- Unity2017 经典游戏开发教程 算法分析与实现 (张帆 著)
https://meta.box.lenovo.com/link/view/82c451b41ce34e81a4b34cb46747d3d5 第1章 熟悉Unity软件的操作 第2章 打地鼠 (已看) ...
- java 多维数组转化为字符串
int[][] a = {{1,2,3},{4,5,7}}; System.out.println(Arrays.deepToString(a)); Arrays.deepToString()此方法是 ...
- Soliworks 2016建模细节总结(1)
Soliworks 2016建模小细节总结(1) 1.Solidworks 2016三维建模的时候,如果想要在一个视图里面呈现出四个视图(包括三个独立的视图以及三维结构的实体模型图),可以直接按鼠标会 ...
- 关于java获取网页内容
最近项目需求,做一些新闻站点的爬取工作.1.简单的jsoup爬取,静态页面形式: String url="a.atimo.cn";//静态页面链接地址Document doc = ...
- DP动态规划练习
先来看一下经典的背包问题吧 http://www.cnblogs.com/Kalix/p/7617856.html 01背包问题 https://www.cnblogs.com/Kalix/p/76 ...
- 给eclipse安装color-theme插件
给eclipse安装color-theme插件 2016年03月22日 19:16:01 ming_love 阅读数:5193 标签: Eclipse Color Theme 更多 个人分类: jav ...
- python图片大小处理;
循环一个目录将下面的所有png或者jpg文件全部缩小一定比例: from PIL import Image import os,re work_dir = 'C:\\Users\\Admini ...
- python SyntaxError: Non-ASCII character '\xe8' in file C:\Users\nwpujun\PycharmProjects\projects\hrl1\hrlAgent\src\li_nn.py on line 52
解决方法:在文件头部加上这样的一句话 # -*- coding: utf-8 -*- 注意:加在其他的位置可能没用,我就是这样的
- Python3 Tkinter-Scale
1.创建 from tkinter import * root=Tk() Scale(root).pack() root.mainloop() 2.参数 from tkinter import * r ...
- 软件管理——rpm&dpkg、yum&apt-get
一般来说著名的linux系统基本上分两大类: 1. RedHat系列:Redhat.Centos.Fedora等 2. Debian系列:Debian.Ubuntu等 一.RedHat 系列 ...