원 주위에 서 있는 짝수 명의 사람이 있고 각 사람이 다른 사람과 악수한다고 가정하면 총 n/2회의 악수가 됩니다. 악수가 교차하지 않도록 이러한 악수가 발생할 수 있는 방법의 수를 찾아야 합니다. 답변이 매우 클 수 있으므로 답변 모드 10^9 + 7을 반환하십시오.
따라서 입력이 n =2와 같으면 출력은 1
이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
m :=10^9 + 7
-
(n+1) 크기의 배열 dp 정의
-
dp[0] :=1
-
초기화 i :=0의 경우 i <=n일 때 i 업데이트 i :=i + 2, 수행 -
-
초기화 j :=0의 경우 j <=i-2일 때 j :=j + 2를 업데이트하고 -
를 수행합니다.-
dp[i] :=dp[i] + (dp[j] 모드 m * dp[i - 2 - j] 모드 m)
-
dp[i] :=dp[i] 모드 m
-
-
-
반환 dp[n] mod m
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; const int m = 1e9+7; typedef long long int lli; class Solution { public: int numberOfWays(int n) { vector <lli> dp(n+1); dp[0] = 1; for(int i = 0; i <= n; i+=2 ){ for(int j =0 ; j <= i-2; j+=2){ dp[i] += (dp[j]%m * dp[i-2-j]%m)%m; dp[i]%=m; } } return dp[n]%m; } }; main(){ Solution ob; cout << (ob.numberOfWays(2)); }
입력
2
출력
1