题意:

求n * n的网格图横竖对称的填法

思路:

假设是个n * n的网格图,如果第一行放在第一列那就剩下的(n-1) * (n-1)化简问题 , 如果第一行放在第二列 , 那第二行的位置也就固定了,剩下(n-2) * (n-2),同理第三第四。。。。,除去第一行有 n - 1 行
所以可以得出dp[ i ] = dp[ i - 1 ] + (i-1)*dp[ i - 2 ]

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[100005];
int main(){
    dp[0] = dp[1] = 1;dp[2] = 2;
    ll n;
    cin>>n;
    for(int i = 3 ; i <= n ;++i){
        dp[i] = (dp[i-1] + (i-1)*dp[i-2])%mod;
    }
    cout<<dp[n]<<endl;
}