LeetCode 1259. Handshakes That Don't Cross

Posted onepunchcoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1259. Handshakes That Don't Cross相关的知识,希望对你有一定的参考价值。

一、原题描述

You are given an even number of people num_people that stand around a circle and each person shakes hands with someone else, so that there are num_people / 2 handshakes total.

Return the number of ways these handshakes could occur such that none of the handshakes cross.

Since this number could be very big, return the answer mod 10^9 + 7

 

Example 1:

Input: num_people = 2
Output: 1

Example 2:

技术图片

Input: num_people = 4
Output: 2
Explanation: There are two ways to do it, the first way is [(1,2),(3,4)] and the second one is [(2,3),(4,1)].

Example 3:

技术图片

Input: num_people = 6
Output: 5

Example 4:

Input: num_people = 8
Output: 14

 

Constraints:

  • 2 <= num_people <= 1000
  • num_people % 2 == 0

二、简要翻译

n(偶数)个人围成个圈,两两握手,要求不能交叉握手。求可能的握手方案个数(mod 10^9 + 7)

 

三、思路分析

  • 动态规划类问题。可以从上到下或者从下到上来解决这个问题。
  • 假设有n个人,数组result[i] 表示i个人构成的子问题的答案。
  • 第一个人只能和第2,4,6,8 ... 个人握手。根据握手结果将圆分成两个半球。
  • result[n] = result[0] * result[n-2] + result[2] * result[n-4] + result[4] * result[n-6] +...+ result[n-2] * result[0]
  • 循环计算的时候注意要mod 10^9 + 7
  • 这应该是分类成medium的问题吧。

 

 

四、代码

public int numberOfWays(int num_people) {
        int mod = (int) 1e9 + 7;
        int len = num_people / 2;
        long[] results = new long[len + 1];
        results[0] = 1;
        results[1] = 1;
        long result;
        for (int i = 2; i <= len; i++) {
            result = 0;
            for (int j = 1; j <= i; j++) {
                result += (results[j - 1] * results[i - j]) % mod;
                result %= mod;
            }
            results[i] = result;
        }
        return (int) results[len];
    }

  

以上是关于LeetCode 1259. Handshakes That Don't Cross的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces-534D Handshakes

c_cpp https://arena.topcoder.com/#/u/practiceCode/1259/1260/1331/1/1259

P1259 黑白棋子的移动

P1259 黑白棋子的移动

DP P1259

1259:例9.3求最长不下降序列