원형으로 배치된 노드의 수를 나타내는 숫자 n이 있다고 가정합니다. 모든 노드가 모서리로 연결되고 모서리가 서로 교차하지 않도록 n/2개의 모서리를 배치할 수 있는 방법의 수를 찾아야 합니다. 답이 매우 크면 결과 모드 10^9 + 7을 반환합니다.
따라서 입력이 n =4와 같으면 아래와 같이 그룹화할 수 있으므로 출력은 2가 됩니다. -
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
(n/2 + 1) 크기의 배열 dp 정의
-
dp[0] :=1, dp[1] :=1
-
m :=10^9+7
-
initialize i :=2의 경우 i <=n / 2일 때 업데이트(i를 1만큼 증가), −
-
높음 :=나는
-
dp[i] :=0
-
j:=1 초기화의 경우 j <=high / 2일 때 업데이트(j를 1만큼 증가), −
-
dp[i] :=(dp[i] + (2 * dp[j - 1] * dp[high - j])) 모드 m
-
-
높은 % 2가 0이 아닌 경우 -
-
dp[i] :=(dp[i] + (dp[(높은 - 1) / 2] * dp[(높은 - 1) / 2])) 모드 m
-
-
dp[i] :=dp[i] 모드 m
-
-
반환 dp[n / 2]
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; int solve(int n) { vector<long long> dp(n / 2 + 1); dp[0] = 1; dp[1] = 1; int m = 1000000007; for (int i = 2; i <= n / 2; i++) { int high = i; dp[i] = 0; for (int j = 1; j <= high / 2; j++) { dp[i] = (dp[i] + (2 * dp[j - 1] * dp[high - j])) % m; } if (high % 2) dp[i] = (dp[i] + (dp[(high - 1) / 2] * dp[(high - 1) / 2])) % m; dp[i] %= m; } return dp[n / 2]; } main(){ int n = 4; cout << solve(n); }
입력
4
출력
2