[Ybtoj高効率アドバンスド1.1] [再帰]ミスアライメント
問題解決のアイデア
f [n]
をn個の千鳥数とします。n個の数があるとします。n
個の数はk番目(1〜n-1)の位置に
配置されます。1.kはn番目の位置に配置されるため、 n -2の数がずれている場合、この場合、
n番目の位置に配置されていない(n-1)* f [n-2]種類の2.kがあり、n-1(kを含む)があります。 )数をずらして残します(kをn番目の位置に配置できないため)、(n-1)* f [n-1]がある
ため、f [n]は(n-1)*(f [n-1])になります。 + f [n -2])
コード
#include<iostream>
#include<cstdio>
using namespace std;
long long n,f[30];
int main()
{
scanf("%lld",&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;
}