题目
思路
理解次问题的关键在于该问题有n个元素以及n个元素对应的,不能放的位置,也就是所谓的正确位置。
设A,B,C,D,E五个位置,选择第一个元素a的位置,显然有n-1个选择。现在假设a放在B,则b有两种选择。
-
若b放在A,则剩下c,d,e三个元素和他们对应的、不能放的位置,所以剩下的n-2个元素构成了原问题的子问题。
-
若b不放在A,则在这个前提之下,b也有一个不能放的位置,相当于b,c,d,e四个元素分别对应四个不能放的位置,也就是说原问题的规模缩小到了n-1。
所以问题的递推式为 f [ n ] = ( n − 1 ) ∗ ( f [ n − 1 ] + f [ n − 2 ] ) f[n]=(n-1)*(f[n-1]+f[n-2]) f[n]=(n−1)∗(f[n−1]+f[n−2])。
代码
#include<iostream>
using namespace std;
long long func(int n) {
if (n == 0 || n == 1)return 0;
else if (n == 2)
return 1;
return (func(n - 2) + func(n - 1)) * (n - 1);
}
int main() {
int n;
cin >> n;
cout << func(n)<<endl;
return 0;
}