牛客网 NC205036 答题卡 动态规划

1. 题目描述

1.1. Limit

Time Limit: 1000 ms

Memory Limit: 131072 kB

1.2. Problem Description

牛牛即将要参加考试,他学会了填答题卡。

可惜他竖着的答题卡填成了横着的 : (

好奇的他想知道对于 n n n 道题,每道题 n n n 个选项的答题卡 ( n × n n \times n n×n 的矩阵 ),满足横答题卡和竖答题卡图形一致的方案数有多少种。

注:每道题只能选择一个选项,即 n × n n \times n n×n 的矩阵中只能涂黑 n n n 个空。求横竖对称的方案数。


1.3. Input

第一行给出 n n n


1.4. Output

输出方案数,答案对 1 0 9 + 7 10^9 +7 109+7 取模


1.5. Sample Input

3

1.6. Sample Output

4

1.7. Notes

( ■ □ □ □ ■ □ □ □ ■ ) ∣ ( □ ■ □ ■ □ □ □ □ ■ ) ∣ ( ■ □ □ □ □ ■ □ ■ □ ) ∣ ( □ □ ■ □ ■ □ ■ □ □ ) \begin{pmatrix} \blacksquare & \square & \square \\ \square & \blacksquare & \square \\ \square & \square & \blacksquare \\ \end{pmatrix} \Bigg| \begin{pmatrix} \square & \blacksquare & \square \\ \blacksquare & \square & \square \\ \square & \square & \blacksquare \\ \end{pmatrix} \Bigg| \begin{pmatrix} \blacksquare & \square & \square \\ \square & \square & \blacksquare \\ \square & \blacksquare & \square \\ \end{pmatrix} \Bigg| \begin{pmatrix} \square & \square & \blacksquare \\ \square & \blacksquare & \square \\ \blacksquare & \square & \square \\ \end{pmatrix}

1.8. Source

牛客网 NC205036 答题卡


2. 解读

每当矩阵的维度 n n n 增加1时,可以分为两种情况计算。

如果矩阵第 n + 1 n + 1 n+1 行的元素坐标为 ( n + 1 , n + 1 ) (n + 1, n + 1) (n+1,n+1),即在矩阵的右下角时,则原先的 n × n n \times n n×n 维矩阵可以取 f ( n ) f(n) f(n) 种情况。

如果矩阵第 n + 1 n + 1 n+1 行的元素坐标为 ( n + 1 , x ) (n + 1, x) (n+1,x) x ∈ [ 1 , n ] x \in [1, n] x[1,n]时,则第 x x x 行的坐标也被确定了,为 ( x , n + 1 ) (x, n + 1) (x,n+1),其余的 n − 1 n - 1 n1 行可以取 f ( n − 1 ) f(n - 1) f(n1) 种情况。

则递推方程为 f ( n + 1 ) = f ( n ) + n × f ( n − 1 ) f(n + 1) = f(n) + n \times f(n-1) f(n+1)=f(n)+n×f(n1)

可以化为 f ( n ) = f ( n − 1 ) + ( n − 1 ) × f ( n − 2 ) f(n) = f(n - 1) + (n - 1) \times f(n-2) f(n)=f(n1)+(n1)×f(n2)


如当 n n n 2 2 2 变为 3 3 3 时,过程如下所示。

  1. n = 2 n = 2 n=2 时,有两种情况。

( ■ □ □ ■ ) ∣ ( □ ■ ■ □ ) \begin{pmatrix} \blacksquare & \square \\ \square & \blacksquare \\ \end{pmatrix} \Bigg| \begin{pmatrix} \square & \blacksquare \\ \blacksquare & \square \\ \end{pmatrix} ()()

  1. n = 3 n = 3 n=3 且新增的元素在 ( 3 , 3 ) (3, 3) (3,3) 位置时,有 f ( 2 ) = 2 f(2) = 2 f(2)=2 种情况

( ■ □ □ ■ ) → ( ■ □ □ □ ■ □ □ □ ■ ) ∣ ( □ ■ ■ □ ) → ( □ ■ □ ■ □ □ □ □ ■ ) \begin{pmatrix} \blacksquare & \square \\ \square & \blacksquare \\ \end{pmatrix} \to \begin{pmatrix} \blacksquare & \square & \square \\ \square & \blacksquare & \square \\ \square & \square & \blacksquare \\ \end{pmatrix} \Bigg| \begin{pmatrix} \square & \blacksquare \\ \blacksquare & \square \\ \end{pmatrix} \to \begin{pmatrix} \square & \blacksquare & \square \\ \blacksquare & \square & \square \\ \square & \square & \blacksquare \\ \end{pmatrix} ()()

  1. n = 3 n = 3 n=3 且新增的元素在 ( 3 , x ) (3, x) (3,x) x ∈ [ 1 , 2 ] x \in [1,2] x[1,2] 位置时,有 2 × f ( 1 ) = 2 2 \times f(1) = 2 2×f(1)=2 种情况。

( □ □ ■ □ ■ □ ■ □ □ ) ∣ ( ■ □ □ □ □ ■ □ ■ □ ) \begin{pmatrix} \square & \square & \blacksquare \\ \square & \blacksquare & \square \\ \blacksquare & \square & \square \\ \end{pmatrix} \Bigg| \begin{pmatrix} \blacksquare & \square & \square \\ \square & \square & \blacksquare \\ \square & \blacksquare & \square \\ \end{pmatrix}

所以 f ( 3 ) = f ( 2 ) + 2 × f ( 1 ) = 2 + 2 = 4 f(3) = f(2) + 2 \times f(1) = 2 + 2 = 4 f(3)=f(2)+2×f(1)=2+2=4

3. 代码

#include<iostream>
using namespace std;
const int mod=1e9+7;
const int N=1e5+10;
typedef long long ll;
ll n;
ll f[N];
int main() {
    int i;
    cin>>n;
    f[1]=1; f[2]=2;
    for (i=3;i<=n;i++)
        f[i]=(f[i-1]+(i-1)*f[i-2]%mod)%mod;
    cout<<f[n]<<endl;
    return 0;
}

联系邮箱:curren_wong@163.com

Github:https://github.com/CurrenWong

欢迎转载/Star/Fork,有问题欢迎通过邮箱交流。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值