递推求解专题练习(For Beginner)
2017-05-08 19:13
281 查看
这里写链接内容HDU 2044 一只小蜜蜂…
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
这个先用dfs写了一下,肯定是超时的,然后看了一下,发现a到b其实就是1到b-a+1;
然后打个表出来就好了
对于每个数n都是从n-1,n-2来的
f
=f[n-1]+f[n-2]
HDU 2045
不容易系列之(3)—— LELE的RPG难题
题意:排成一行的n个方格,用红,粉,绿三种颜色涂每个格子,每格涂一色,要求相邻的方块不能同色,且首尾两格不能同色,求全部满足要求的涂法。
f[i],表示i个格子的涂色方案。假设n-1个格子已经涂好色了,然后对于n来说,如果前n-1个格子已经涂好色了(第一个和第n-1个颜色不相同)就是f[n-1],然后如果第一个和第n-1个颜色不相同,那就是f[n-2]*2
递推式为:f
=f[n-1]+f[n-2]*2;
先要把之前几个写出来
f[1]=3
f[2]=6
f[3]=6//注意这里因为f[1]是肯定相同的
HDU 2046 骨牌铺方格
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:
当n-1种已经排好后,第n种只有横着放和竖着放两种,竖着放就是f[n-1],横着的就是f[n-2];
f
=f[n-1]+f[n-2];
HDU 2047 阿牛的EOF牛肉串
题意:就是一串字符串,一共有三种字符E,O,F,其中O,O两个不能在一起,问给你字符串的长度n,求一共有多少种组合
递推式:
f
=f[n-1]*3-f[n-3]*2;
f[n-1],表示前面n-1个字符已经填好的种数,f[n-1]*3,表示不考虑f[n-1]有没有o的情况,然后减去有o的情况,当n-1个字符为o的时候,此时n-2,肯定不是O,所以为f[n-3]*2;
HDU 2049 神、上帝以及老天爷 错排
题意就是:有n个人,然后每个人不能拿到和自己编号相同的字条
错排:对于第一个位子,有n-1种方法,我们假设放了k,然后对于k的位子,我们如果放了1的话,之后就是对于n-2的错排。如果1不放到k,就可以把k的位置看成“第1个位置”,然后就是n-1的错排
f(n)=(n-1)*(f(n-1)+f(n-2))
HDU 2049 不容易系列之(4)——考新郎
题意:和上一题差不多,就是感觉我有点忘了那个排列数
HDU 2050 折线分割平面
f
=f[n-1]+(n-1)*2+1+(n-1)*2+2-2;
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
这个先用dfs写了一下,肯定是超时的,然后看了一下,发现a到b其实就是1到b-a+1;
然后打个表出来就好了
对于每个数n都是从n-1,n-2来的
f
=f[n-1]+f[n-2]
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; int a,b; const int maxn = 55; long long f[maxn]; void ini() { f[1]=1; f[2]=1; for(int i=3;i<=50;i++) f[i]=f[i-1]+f[i-2]; } int main() { int T; scanf("%d",&T); ini(); while(T--){ scanf("%d %d",&a,&b); long long ans=f[b-a+1]; cout<<f[b-a+1]<<endl; } return 0; }
HDU 2045
不容易系列之(3)—— LELE的RPG难题
题意:排成一行的n个方格,用红,粉,绿三种颜色涂每个格子,每格涂一色,要求相邻的方块不能同色,且首尾两格不能同色,求全部满足要求的涂法。
f[i],表示i个格子的涂色方案。假设n-1个格子已经涂好色了,然后对于n来说,如果前n-1个格子已经涂好色了(第一个和第n-1个颜色不相同)就是f[n-1],然后如果第一个和第n-1个颜色不相同,那就是f[n-2]*2
递推式为:f
=f[n-1]+f[n-2]*2;
先要把之前几个写出来
f[1]=3
f[2]=6
f[3]=6//注意这里因为f[1]是肯定相同的
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int maxn = 55; long long f[maxn]; void ini() { f[1]=3; f[2]=6; f[3]=6;//注意,这里的f[3]要列举出来,因为f[1]肯定是相同的; for(int i=4;i<=50;i++) f[i]=f[i-1]+f[i-2]*2; } int main() { int n; ini(); while(scanf("%d",&n)!=EOF) { cout<<f <<endl; } return 0; }
HDU 2046 骨牌铺方格
在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:
当n-1种已经排好后,第n种只有横着放和竖着放两种,竖着放就是f[n-1],横着的就是f[n-2];
f
=f[n-1]+f[n-2];
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int maxn = 55; long long f[maxn]; void ini() { f[1]=1; f[2]=2; f[3]=3; for(int i=4;i<=50;i++) f[i]=f[i-1]+f[i-2]; } int main() { int n; ini(); while(scanf("%d",&n)!=EOF) { cout<<f <<endl; } return 0; }
HDU 2047 阿牛的EOF牛肉串
题意:就是一串字符串,一共有三种字符E,O,F,其中O,O两个不能在一起,问给你字符串的长度n,求一共有多少种组合
递推式:
f
=f[n-1]*3-f[n-3]*2;
f[n-1],表示前面n-1个字符已经填好的种数,f[n-1]*3,表示不考虑f[n-1]有没有o的情况,然后减去有o的情况,当n-1个字符为o的时候,此时n-2,肯定不是O,所以为f[n-3]*2;
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int maxn = 55; long long f[maxn]; long long ans=0; int n; /*void dfs(int bg,int t) { if(t==n) {ans++;return ;} for(int i=1;i<=3;i++) { if(bg==2&&i==2) continue; else { dfs(i,t+1); } } }*/ void ini() { f[1]=3; f[2]=8; f[3]=22; f[4]=60; for(int i=5;i<=40;i++) f[i]=f[i-1]*3-f[i-3]*2; } int main() { ini(); while(scanf("%d",&n)!=EOF) { cout<<f <<endl; } return 0; }
HDU 2049 神、上帝以及老天爷 错排
题意就是:有n个人,然后每个人不能拿到和自己编号相同的字条
错排:对于第一个位子,有n-1种方法,我们假设放了k,然后对于k的位子,我们如果放了1的话,之后就是对于n-2的错排。如果1不放到k,就可以把k的位置看成“第1个位置”,然后就是n-1的错排
f(n)=(n-1)*(f(n-1)+f(n-2))
HDU 2049 不容易系列之(4)——考新郎
题意:和上一题差不多,就是感觉我有点忘了那个排列数
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> using namespace std; const int maxn = 25; long long f[maxn]; long long y[maxn]; void ini() { f[1]=0; f[2]=1; f[3]=2; y[0]=1; for(int i=4;i<=20;i++) f[i]=(i-1)*(f[i-1]+f[i-2]); for(int i=1;i<=20;i++) y[i]=y[i-1]*i; } int main() { int C; scanf("%d",&C); ini(); while(C--) { int n,m; scanf("%d %d",&n,&m); long long x=1; int temp=n-m; for(int i=n-temp+1;i<=n;i++) x*=i; cout<<(f[m]*x)/y[n-m]<<endl; } return 0; }
HDU 2050 折线分割平面
f
=f[n-1]+(n-1)*2+1+(n-1)*2+2-2;
相关文章推荐
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner) 【hdu】
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner) 折线分割平面 HDU 2050
- Hdu递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner)
- 递推求解专题练习(For Beginner)
- 递推求解专题练习
- hdu 2044-2050 递推求解专题练习
- HDU 递推求解专题练习 2045 2046 2047 2048 2049 2050
- 递归递推练习专题总结
- 递推求解专题训练
- HDU 2047--阿牛的EOF牛肉串(递推求解专题)
- HDU-#2044-2050 递推求解专题
- HDU 2041--超级楼梯题解(递推求解专题)
- 递推递归练习 D - 汉诺塔系列1
- 递推递归练习 I 蟠桃计