「 「 「基础算法 」 」 」第1章 递推算法
目录:
A.错排问题
B.奇怪汉诺塔
C.数的划分
D.传球游戏
E.平铺方案
A . A. A. 例题 1 1 1 错排问题
分析:
考虑第 n n n个元素 放在 k k k位上 那么有 ( n − 1 ) (n-1) (n−1)种方案 ( k ≠ n ) (k≠n) (k=n)
再考虑这个 k k k 当它在 n n n位时 就有由于 n , k n,k n,k两元素位置相同 其他 n − 2 n-2 n−2个元素错排即可
当 k k k不在 n n n位时 直接 n − 1 n-1 n−1个元素错排
递推式: f n = ( n − 1 ) ∗ ( f n − 1 + f n − 2 ) f_n=(n-1)*(f_{n-1}+f_{n-2}) fn=(n−1)∗(fn−1+fn−2)
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
long long f[25];
int main(){
scanf("%d",&n);
f[1]=0;f[2]=1;
for(int i=3;i<=n;i++)
f[i]=(i-1)*(f[i-1]+f[i-2]); //递推
printf("%lld",f[n]);
return 0;
}
B . B. B. 例题 2 2 2 奇怪汉诺塔
分析:
看到这个 n n n这么小 直接打表
考虑只有 3 3 3座塔的汉诺塔问题 设 f n f_n fn为 n n n盘子 3 3 3塔的最优步数
先把 n − 1 n-1 n−1个盘子移到 B B B塔 则步数为 f n − 1 f_{n-1} f