递推专题(一)HDU2044——2050
2017-08-18 15:35
218 查看
在Hdu上是下面几题:
Hdu 2041 超级楼梯
下面是解题报告(因为有的题有点水,和贴发)
Hdu 2044 一只小蜜蜂...
分析:数一下前几种可能的走法,不难发现这是个斐波那契数。但是题目给定任意两个数a和b(a<b),计算a到b的走法。因为是从a到b的走法,所以从1到a的走法我们不用讨论,同理从1到b的走法我们也不用讨论。这样,就可以将a看做1,将b看做(b-a+1),转化为求从1到(b-a+1)的走法。
o(╯□╰)o:只知道是斐波那契数,但是布吉岛斐波那契数数的增长很快,很容易爆int。
下面是代码:
[html]
view plain
copy
print?
/*Hdu 2044 一只小蜜蜂...
递推 斐波那契数
数组开long long,斐波那契数增长很快
*/
#include<iostream>
using namespace std;
const int maxn = 60;
long long f[maxn];
int t,a,b;
int main()
{
f[1] = 1;
f[2] = 1;
for(int i = 3; i <= maxn; i++) f[i] = f[i-1] + f[i-2];
cin>>t;
while(t--)
{
cin>>a>>b;
cout<<f[b-a+1]<<endl;
}
return 0;
}
Hdu 2045 不容易系列之(3)—— LELE的RPG难题
分析:
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 55;
long long F[maxn];
int n;
int main()
{
F[1] = 3;
F[2] = 6;
F[3] = 6;
for(int i = 4; i <= maxn; i++) F[i] = F[i-1] + 2 * F[i-2];
while(cin>>n) cout<<F
<<endl;
return 0;
}
Hdu 2046 骨牌铺方路
分析:前一排只有一种方法,所以只用讨论F[n-1];前二排也只有一种方法,那么讨论F[n-2]。所以递推式:F
= F[n-1] + F[n-2]。这也是斐波那契数。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 55;
long long f[maxn];
int n;
int main()
{
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= maxn; i++) f[i] = f[i-1] + f[i-2];
while(cin>>n) cout<<f
<<endl;
return 0;
}
Hdu 2047 阿牛的EOF牛肉串
分析:设F
可以由两个部分得到,第(n-1)个为O,第(n-1)个为O。
F
= 2 * (为O) + 3 *(不为O)
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 45;
long long A[maxn];
long long B[maxn];
int n;
int main()
{
A[1] = 1;
B[1] = 2;
for(int i = 2; i <= maxn; i++)
{
A[i] = B[i-1];
B[i] = 2 * (A[i-1] +B[i-1]);
}
while(cin>>n) cout<<A
+B
<<endl;
return 0;
}
Hdu 2048 神,上帝和老天爷
分析:全错位排列。当n小于8时,用递推求解;当n大于8时,基本上概率不变。不过犯二了,记错变形后的递推公式了,囧!
下面是代码“:
[html]
view plain
copy
print?
/*Hdu 2048 神,上帝和老天爷
全错位排列
*/
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 50;
double D[maxn];
int n;
int main()
{
D[1] = 0;
D[2] = 1;
int t;
scanf("%d",&t);
while(t--)
{
double f = 1;
scanf("%d",&n);
if(n <= 10)
{
for(int i = 2; i <= n; i++)
{
f = f * i;
double flag;
if(i%2 == 0) flag = +1;
else flag = -1;
D[i] = i * D[i-1] + flag;
}
int ans = floor((D
/f+0.00005)*10000);
printf("%.2lf%\n",(double)ans/100);
}
else
printf("36.79%10\n");
}
return 0;
}
Hdu 2
c5bc
049 不容易系列之(4)——考新郎
分析:这到题和上一题相似,都是错位排列。只不过上一题是全错位排列,只一题是部分错位排列。但是原理没有什么不一样的。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 25;
long long F[maxn],C[maxn];
int t,n,m;
int main()
{
F[1] = 0;
F[2] = 1;
C[0] = 1;
for(int i = 3; i <= maxn; i++) F[i] = (i-1) * (F[i-1] + F[i-2]);
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i = 1; i <= n; i++) C[i] = C[i-1]*(n-i+1)/i;
cout<<C[m]*F[m]<<endl;
}
return 0;
}
Hdu 2050 折线分割平面
分析:首先搞清楚直线分割平面问题,然后再根据直线问题解决折线问题。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
int n,t;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
cout<<1 + (2*n)*(2*n+1)/2 - 2*n<<endl;
}
return 0;
}
Hdu 2041 超级楼梯
很简单的递推题,直接代码
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 50;
int d[maxn];
int t,n;
void print()
{
d[1] = 1;
d[2] = 1;
for(int i = 3; i < maxn; i++)
{
d[i] = d[i-1] + d[i-2];
}
}
int main()
{
cin>>t;
print();
while(t--)
{
cin>>n;
cout<<d
<<endl;
}
return 0;
}
好了,前前后后花了不少时间才刷完这几道递推入门题。都是很基础的一些问题。
Hdu 2041 超级楼梯
下面是解题报告(因为有的题有点水,和贴发)
Hdu 2044 一只小蜜蜂...
分析:数一下前几种可能的走法,不难发现这是个斐波那契数。但是题目给定任意两个数a和b(a<b),计算a到b的走法。因为是从a到b的走法,所以从1到a的走法我们不用讨论,同理从1到b的走法我们也不用讨论。这样,就可以将a看做1,将b看做(b-a+1),转化为求从1到(b-a+1)的走法。
o(╯□╰)o:只知道是斐波那契数,但是布吉岛斐波那契数数的增长很快,很容易爆int。
下面是代码:
[html]
view plain
copy
print?
/*Hdu 2044 一只小蜜蜂...
递推 斐波那契数
数组开long long,斐波那契数增长很快
*/
#include<iostream>
using namespace std;
const int maxn = 60;
long long f[maxn];
int t,a,b;
int main()
{
f[1] = 1;
f[2] = 1;
for(int i = 3; i <= maxn; i++) f[i] = f[i-1] + f[i-2];
cin>>t;
while(t--)
{
cin>>a>>b;
cout<<f[b-a+1]<<endl;
}
return 0;
}
/*Hdu 2044 一只小蜜蜂... 递推 斐波那契数 数组开long long,斐波那契数增长很快 */ #include<iostream> using namespace std; const int maxn = 60; long long f[maxn]; int t,a,b; int main() { f[1] = 1; f[2] = 1; for(int i = 3; i <= maxn; i++) f[i] = f[i-1] + f[i-2]; cin>>t; while(t--) { cin>>a>>b; cout<<f[b-a+1]<<endl; } return 0; }
Hdu 2045 不容易系列之(3)—— LELE的RPG难题
分析:
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 55;
long long F[maxn];
int n;
int main()
{
F[1] = 3;
F[2] = 6;
F[3] = 6;
for(int i = 4; i <= maxn; i++) F[i] = F[i-1] + 2 * F[i-2];
while(cin>>n) cout<<F
<<endl;
return 0;
}
#include<iostream> using namespace std; const int maxn = 55; long long F[maxn]; int n; int main() { F[1] = 3; F[2] = 6; F[3] = 6; for(int i = 4; i <= maxn; i++) F[i] = F[i-1] + 2 * F[i-2]; while(cin>>n) cout<<F <<endl; return 0; }
Hdu 2046 骨牌铺方路
分析:前一排只有一种方法,所以只用讨论F[n-1];前二排也只有一种方法,那么讨论F[n-2]。所以递推式:F
= F[n-1] + F[n-2]。这也是斐波那契数。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 55;
long long f[maxn];
int n;
int main()
{
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= maxn; i++) f[i] = f[i-1] + f[i-2];
while(cin>>n) cout<<f
<<endl;
return 0;
}
#include<iostream> using namespace std; const int maxn = 55; long long f[maxn]; int n; int main() { f[0] = 1; f[1] = 1; for(int i = 2; i <= maxn; i++) f[i] = f[i-1] + f[i-2]; while(cin>>n) cout<<f <<endl; return 0; }
Hdu 2047 阿牛的EOF牛肉串
分析:设F
可以由两个部分得到,第(n-1)个为O,第(n-1)个为O。
F
= 2 * (为O) + 3 *(不为O)
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 45;
long long A[maxn];
long long B[maxn];
int n;
int main()
{
A[1] = 1;
B[1] = 2;
for(int i = 2; i <= maxn; i++)
{
A[i] = B[i-1];
B[i] = 2 * (A[i-1] +B[i-1]);
}
while(cin>>n) cout<<A
+B
<<endl;
return 0;
}
#include<iostream> using namespace std; const int maxn = 45; long long A[maxn]; long long B[maxn]; int n; int main() { A[1] = 1; B[1] = 2; for(int i = 2; i <= maxn; i++) { A[i] = B[i-1]; B[i] = 2 * (A[i-1] +B[i-1]); } while(cin>>n) cout<<A +B <<endl; return 0; }
Hdu 2048 神,上帝和老天爷
分析:全错位排列。当n小于8时,用递推求解;当n大于8时,基本上概率不变。不过犯二了,记错变形后的递推公式了,囧!
下面是代码“:
[html]
view plain
copy
print?
/*Hdu 2048 神,上帝和老天爷
全错位排列
*/
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 50;
double D[maxn];
int n;
int main()
{
D[1] = 0;
D[2] = 1;
int t;
scanf("%d",&t);
while(t--)
{
double f = 1;
scanf("%d",&n);
if(n <= 10)
{
for(int i = 2; i <= n; i++)
{
f = f * i;
double flag;
if(i%2 == 0) flag = +1;
else flag = -1;
D[i] = i * D[i-1] + flag;
}
int ans = floor((D
/f+0.00005)*10000);
printf("%.2lf%\n",(double)ans/100);
}
else
printf("36.79%10\n");
}
return 0;
}
/*Hdu 2048 神,上帝和老天爷 全错位排列 */ #include<cstdio> #include<cmath> using namespace std; const int maxn = 50; double D[maxn]; int n; int main() { D[1] = 0; D[2] = 1; int t; scanf("%d",&t); while(t--) { double f = 1; scanf("%d",&n); if(n <= 10) { for(int i = 2; i <= n; i++) { f = f * i; double flag; if(i%2 == 0) flag = +1; else flag = -1; D[i] = i * D[i-1] + flag; } int ans = floor((D /f+0.00005)*10000); printf("%.2lf%\n",(double)ans/100); } else printf("36.79%10\n"); } return 0; }
Hdu 2
c5bc
049 不容易系列之(4)——考新郎
分析:这到题和上一题相似,都是错位排列。只不过上一题是全错位排列,只一题是部分错位排列。但是原理没有什么不一样的。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 25;
long long F[maxn],C[maxn];
int t,n,m;
int main()
{
F[1] = 0;
F[2] = 1;
C[0] = 1;
for(int i = 3; i <= maxn; i++) F[i] = (i-1) * (F[i-1] + F[i-2]);
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i = 1; i <= n; i++) C[i] = C[i-1]*(n-i+1)/i;
cout<<C[m]*F[m]<<endl;
}
return 0;
}
#include<iostream> using namespace std; const int maxn = 25; long long F[maxn],C[maxn]; int t,n,m; int main() { F[1] = 0; F[2] = 1; C[0] = 1; for(int i = 3; i <= maxn; i++) F[i] = (i-1) * (F[i-1] + F[i-2]); cin>>t; while(t--) { cin>>n>>m; for(int i = 1; i <= n; i++) C[i] = C[i-1]*(n-i+1)/i; cout<<C[m]*F[m]<<endl; } return 0; }
Hdu 2050 折线分割平面
分析:首先搞清楚直线分割平面问题,然后再根据直线问题解决折线问题。
下面是代码:
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
int n,t;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
cout<<1 + (2*n)*(2*n+1)/2 - 2*n<<endl;
}
return 0;
}
#include<iostream> using namespace std; int n,t; int main() { cin>>t; while(t--) { cin>>n; cout<<1 + (2*n)*(2*n+1)/2 - 2*n<<endl; } return 0; }
Hdu 2041 超级楼梯
很简单的递推题,直接代码
[html]
view plain
copy
print?
#include<iostream>
using namespace std;
const int maxn = 50;
int d[maxn];
int t,n;
void print()
{
d[1] = 1;
d[2] = 1;
for(int i = 3; i < maxn; i++)
{
d[i] = d[i-1] + d[i-2];
}
}
int main()
{
cin>>t;
print();
while(t--)
{
cin>>n;
cout<<d
<<endl;
}
return 0;
}
#include<iostream> using namespace std; const int maxn = 50; int d[maxn]; int t,n; void print() { d[1] = 1; d[2] = 1; for(int i = 3; i < maxn; i++) { d[i] = d[i-1] + d[i-2]; } } int main() { cin>>t; print(); while(t--) { cin>>n; cout<<d <<endl; } return 0; }
好了,前前后后花了不少时间才刷完这几道递推入门题。都是很基础的一些问题。
相关文章推荐
- HDU-#2044-2050 递推求解专题
- hdu 2044-2050 递推求解专题练习
- HDOJ(HDU).2044-2049 递推专题
- hdu_2044_一只小蜜蜂...(递推专题)
- HDU 递推求解专题练习 2045 2046 2047 2048 2049 2050
- 递推求解专题练习(For Beginner) 折线分割平面 HDU 2050
- 递推 Problem M:折线分割平面(HDU 2050)
- HDU - 2050 折线分割平面 递推 - 折线的平面分割
- HDU-2050 折现分割平面 递推
- hdu 2050折线分割平面 递推
- HDU 2050:折线分割平面(找规律,递推)
- HDU 2047--阿牛的EOF牛肉串(递推求解专题)
- hdu 2050 递推,折线分平面
- HDU-2044(递推)
- HDU 2041--超级楼梯题解(递推求解专题)
- HDU 2050- 折线分割平面 -递推求解
- HDU2044 一只小蜜蜂... 动态规划入门-递推
- hdu 2050 折线分割平面 (递推)
- HDU_2044——蜜蜂走蜂房,递推
- HDU_2050——折线分割平面问题,递推