题目来源
2016年中北大学新生赛
题目描述
很久很久以前,有一个勇者郭姐,她像我们所熟知的故事一样,历经千难万险,来到了魔王的城堡门口。
城堡门关着,郭姐必须想办法打开大门。这时候,郭姐发现魔王的城堡门口有n个凹槽,正好和她旅途上得到的n个不同的水晶球相符。为了保险起见,勇者郭姐在城堡门口蹲点,抓住了一个小妖,小妖告诉郭姐,这n个凹槽每一个对应一个水晶球,开门必须满足两个条件:
1.n个凹槽上都有水晶球
2.n个凹槽上至少要有一个水晶球放对位置
我们知道郭姐是从非洲偷渡过来的,有着无与伦比的非洲血统,她需要知道她最多需要放几次水晶球才能保证一定能把门打开
输入描述
一个数字n
输出描述
一个数字表示郭姐放水晶球的次数
分析
错位排序,先算出每个位置都不对总共有多少种情况。然后加一。
f(n)=(n-1)(f(n-1)+f(n-2))
f(1)=0;f(2)=1;
代码
#include<algorithm>
#include <cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll dp[25];
int main(){
dp[1]=0;dp[2]=1;
for(int i=3;i<=20;i++){
dp[i]=(i-1)*(dp[i-1]+dp[i-2]);
}
ll n;
cin>>n;
cout<<dp[n]+1<<endl;
return 0;
}