递推专场训练:
写在开头:
今天是我陈鸽子拖更的第一个月,是时候要更新了,请大家还多多支持,小的再也不敢~~(还敢)~~托更了!!
哎,为了安慰一下大家被咕咕咕的心情,我今天马上更!
话8多说,🏇上开始!
T1:
题目描述:
用1 x 1和2 x 2的磁砖不重叠地铺满N x 3的地板,共有多少种方案?
正解:
这道题,emmm…
我们首先设
f i = 当 前 第 i 块 时 的 方 案 数 f_i = 当前第i块时的方案数 fi=当前第i块时的方案数
然后暴力打出几个数据 : 1,3,5,11 … 这时,我们便找规律,找出一个公式包含
f i − 1 和 f i − 2 f_{i-1} 和 f_{i-2} fi−1和fi−2
的式子,然后,我们就能快乐的写出递推公式啦!
f i = f i − 1 + f i − 2 ∗ 2 f_{i}=f_{i-1}+f_{i-2}*2 fi=fi−1+fi−2∗2
code:
#include<bits/stdc++.h>
#define MAX 2*1e9
#define MIN -2*1e9
int read()
{
int s=1,num=0;
char ch; ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') s=-1; ch=getchar();};
while(ch>='0'&&ch<='9') {
num=num*10+int (ch-'0'); ch=getchar();};
return num*s;
}
using namespace std;
int a[100001];
int main()
{
// freopen("problem1.in","r",stdin);
// freopen("problem1.out","w",stdout);
int n;
a[0]=1;
a[1]=1;
a[2]=3;
n=read();
for(int i=3;i<=n;i++)
a[i]=(a[i-1]+a[i-2]*2)%12345;
printf("%d",a[n]%12345);
return 0;
}
T2:
题目描述:
从原点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?
正解:
这道题,emmm…
还是,我们首先设
f i = 当 前 第 i 步 时 的 方 案 数 f_i = 当前第i步时的方案数 fi=当前第i步时的方案数
然后暴力打出几个数据 : 3,7,17 … 这时,我们便找规律,发现,每往上走一次,就能多两种方案,而往上走,又是一种,
这不就恰巧对印了
f i − 1 和 f i − 2 f_{i-1} 和 f_{i-2} fi−1和fi−2
那么递推公式,也就呼之欲出了:
f i = f i − 1 ∗ 2 + f i − 2 f_{i}=f_{i-1}*2+f_{i-2} fi=fi−1∗2+fi−2
code:
#include<bits/stdc++.h>
#define MAX 2*1e9
#define MIN -2*1e9
int read()
{
int s=1,num=0;
char ch; ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') s=-1; ch=getchar();};
while(ch>=