您的位置:首页 > 其它

寒假训练 递推专题

2015-01-27 13:32 183 查看

问题 A : 贴瓷砖

问题分析:这道题类似于爬楼梯问题,采用递推算法,关键是找到递推规律:用f
表示n列的方案数,则f
:=f[n-1]+2*f[n-2]。

分析易得f[0]=0,f[1]=1,f[2]=3

代码:

#include <stdio.h>
int main()
{
int r[31];
int T;
int n;
scanf("%d", &T);
r[0] = 0;
r[1] = 1;
r[2] = 3;
for(n = 3; n <= 30; n ++)
r
= r[n-1] + r[n-2]*2;
while(T--)
{
scanf("%d",&n);
printf("%d\n",r
);
}
return 0;
}


问题 B : 统计方案

问题分析:设f
表示走n步的情况,最后一步可能由三种走法,向上,向左或向右,而无论倒数第二步怎么走,最后一步都能向上,所以最后一步向上的走法为f[n-1];

当最后一步向左或向右时要考虑第n-1步,如果第n-1步向上(方案为f[n-2])则,第n步向左或向右的方案为2*f[n-2],如果第n-1步不向上(方案为f[n-1]-f[n-2]),则最后一步向左或向右的情况为f[n-1]-f[n-2];

然后分析可得第一步结果是3,第二步有7种可能,往后递推即可。

代码:

#include<stdio.h>
int main()
{
long int f[26];
int t,i,n;
f[1]=3;f[2]=7;
for(i=3;i<22;i++)
f[i]=f[i-1]*2+f[i-2];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("%ld\n",f
);
}
return 0;
}


问题 C : 小明养猪的故事

问题分析:和斐波那契数列相关的问题

代码:

#include<stdio.h>
int main()
{
int a,b;
int fibonacci[22];
fibonacci[0] = 1;
fibonacci[1] = 2;
for(int i=2; i<21; i++)
fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
scanf("%d", &b);
while(b--)
{
scanf("%d", &a);
printf("%d\n", fibonacci[a-1]);
}
return 0;
}


问题 D : 小明的烦恼

问题分析:参考第一题思路,整理递推公式。

本题目需要考虑N为奇数和偶数时的不同情况,N为奇数时,公式为: a[i]=a[i-1]*2-1;

N为偶数时,公式为:a[i]=a[i-1]*2+1;

代码:

#include<stdio.h>
int main()
{
int n,i,a[36];
a[0]=0;
a[1]=1;
for(i=2;i<=35;i++)
if(i%2)
a[i]=a[i-1]*2-1;
else
a[i]=a[i-1]*2+1;
scanf("%d",&a[0]);
while(a[0]--)
{
scanf("%d",&n);
printf("%d\n",a
);
}
return 0;
}


问题 E : 不容易系列之一

问题分析:这个问题需要用到错排公式,大家百度一下就知道是什么鬼了,递推公式为f
=(n-1)*(f[n-1]+f[n-2])

代码:

#include<iostream>
using namespace std;
long long set[25];
void fun()
{
memset(set,0,sizeof(set));
set[1]=0;
set[2]=1;
for(int i=3;i<25;i++)
{
set[i]=(i-1)*(set[i-1]+set[i-2]);
}
}
int main()
{
fun();
int n;
while(cin>>n)
{
cout<<set
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: