1259. 不相交的握手

1259. 不相交的握手

偶数 个人站成一个圆,总人数为 n 。每个人与除自己外的一个人握手,所以总共会有 n / 2 次握手。

将握手的人之间连线,请你返回连线不会相交的握手方案数。

由于结果可能会很大,请你返回答案 10^9+7 后的结果

示例

在这里插入图片描述

输入:n = 6
输出:5

解法:DP

思想

状态表示: f ( n ) f(n) f(n) 表示 n n n 个人时的握手方案数

在这里插入图片描述

当十个人时,如图所示,按照最后一个人的握手方式划分整个集合,将会划分成

  • f ( 0 ) f(0) f(0) f ( 8 ) f(8) f(8)
  • f ( 2 ) f(2) f(2) f ( 6 ) f(6) f(6)
  • f ( 4 ) f(4) f(4) f ( 4 ) f(4) f(4)
  • f ( 6 ) f(6) f(6) f ( 2 ) f(2) f(2)
  • f ( 8 ) f(8) f(8) f ( 0 ) f(0) f(0)

根据乘法原理及加法原理不难得出: f ( 10 ) = f ( 0 ) f ( 8 ) + f ( 2 ) f ( 6 ) + f ( 4 ) f ( 4 ) + f ( 6 ) f ( 2 ) + f ( 8 ) f ( 0 ) f(10) = f(0)f(8) + f(2)f(6) + f(4)f(4) + f(6)f(2) + f(8)f(0) f(10)=f(0)f(8)+f(2)f(6)+f(4)f(4)+f(6)f(2)+f(8)f(0)

由此可得 n n n 个人时, f ( n ) = f ( 0 ) f ( n − 2 ) + f ( 2 ) f ( n − 2 ) + . . . + f ( n − 2 ) ( 0 ) f(n) = f(0)f(n - 2) + f(2)f(n - 2) + ... + f(n - 2)(0) f(n)=f(0)f(n2)+f(2)f(n2)+...+f(n2)(0),最后只要计算这一条公式就能得出正确答案。

复杂度

时间复杂度: O ( N 2 ) O(N^2) O(N2)

空间复杂度: O ( N ) O(N) O(N)

代码

class Solution {
    public int numberOfWays(int n) {
        int[] f = new int[n + 1];
        int mod = 1000000007;
        f[0] = 1;
        f[1] = 1;
        for (int i = 2; i <= n; i += 2) {
            int cnt = 0;
            for (int j = 0; j < i; j += 2) {                
                cnt = (int)((cnt + 1L * f[j] * f[i - j - 2]) % mod);
            }
            f[i] = cnt;
        }
        return f[n];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值