Dado un número N, encuentre el número de formas en que puede dibujar N cuerdas en un círculo con 2*N puntos de modo que no se crucen 2 cuerdas.
Dos modos son diferentes si existe un acorde que está presente de un modo y no del otro.
Ejemplos:
Input : N = 2 Output : 2 Explanation: If points are numbered 1 to 4 in clockwise direction, then different ways to draw chords are: {(1-2), (3-4)} and {(1-4), (2-3)} Input : N = 1 Output : 1 Explanation: Draw a chord between points 1 and 2.
Si dibujamos una cuerda entre dos puntos cualesquiera, ¿puede observar que el conjunto actual de puntos se divide en dos conjuntos más pequeños S_1 y S_2? Si dibujamos una cuerda desde un punto en S_1 hasta un punto en S_2, seguramente cortará la cuerda que acabamos de dibujar.
Entonces, podemos llegar a una recurrencia que Ways(n) = sum[i = 0 to n-1] { Ways(i)*Ways(ni-1) }.
Aquí iteramos sobre i, asumiendo que el tamaño de uno de los conjuntos es i y el tamaño de otro conjunto automáticamente es (ni-1) dado que ya hemos usado un par de puntos y un par de puntos i en un conjunto.
C++
// cpp code to count ways // to divide circle using // N non-intersecting chords. #include <bits/stdc++.h> using namespace std; int chordCnt( int A){ // n = no of points required int n = 2 * A; // dp array containing the sum int dpArray[n + 1]={ 0 }; dpArray[0] = 1; dpArray[2] = 1; for (int i=4;i<=n;i+=2){ for (int j=0;j<i-1;j+=2){ dpArray[i] += (dpArray[j]*dpArray[i-2-j]); } } // returning the required number return dpArray[n]; } // Driver function int main() { int N; N = 2; cout<<chordCnt( N)<<'\n'; N = 1; cout<<chordCnt( N)<<'\n'; N = 4; cout<<chordCnt( N)<<'\n'; return 0; } // This code is contributed by Gitanjali.
Java
// Java code to count ways // to divide circle using // N non-intersecting chords. import java.io.*; class GFG { static int chordCnt(int A) { // n = no of points required int n = 2 * A; // dp array containing the sum int[] dpArray = new int[n + 1]; dpArray[0] = 1; dpArray[2] = 1; for (int i = 4; i <= n; i += 2) { for (int j = 0; j < i - 1; j += 2) { dpArray[i] += (dpArray[j] * dpArray[i - 2 - j]); } } // returning the required number return dpArray[n]; } public static void main(String[] args) { int N; N = 2; System.out.println(chordCnt(N)); N = 1; System.out.println(chordCnt(N)); N = 4; System.out.println(chordCnt(N)); } } // This code is contributed by Gitanjali.
Python 3
# python code to count ways to divide # circle using N non-intersecting chords. def chordCnt( A): # n = no of points required n = 2 * A # dp array containing the sum dpArray = [0]*(n + 1) dpArray[0] = 1 dpArray[2] = 1 for i in range(4, n + 1, 2): for j in range(0, i-1, 2): dpArray[i] += (dpArray[j]*dpArray[i-2-j]) # returning the required number return int(dpArray[n]) # driver code N = 2 print(chordCnt( N)) N = 1 print(chordCnt( N)) N = 4 print(chordCnt( N))
C#
// C# code to count ways to divide // circle using N non-intersecting chords. using System; class GFG { static int chordCnt(int A) { // n = no of points required int n = 2 * A; // dp array containing the sum int[] dpArray = new int[n + 1]; dpArray[0] = 1; dpArray[2] = 1; for (int i = 4; i <= n; i += 2) { for (int j = 0; j < i - 1; j += 2) { dpArray[i] += (dpArray[j] * dpArray[i - 2 - j]); } } // returning the required number return dpArray[n]; } // Driver code public static void Main() { int N; N = 2; Console.WriteLine(chordCnt(N)); N = 1; Console.WriteLine(chordCnt(N)); N = 4; Console.WriteLine(chordCnt(N)); } } // This code is contributed by vt_m.
PHP
<?php // PHP code to count ways // to divide circle using // N non-intersecting chords. function chordCnt( $A) { // n = no of points required $n = 2 * $A; // dp array containing the sum $dpArray = array_fill(0, $n + 1, 0); $dpArray[0] = 1; $dpArray[2] = 1; for ($i = 4; $i <= $n; $i += 2) { for ($j = 0; $j < $i - 1; $j += 2) { $dpArray[$i] += ($dpArray[$j] * $dpArray[$i - 2 - $j]); } } // returning the required number return $dpArray[$n]; } // Driver Code $N = 2; echo chordCnt($N), "\n"; $N = 1; echo chordCnt($N), "\n"; $N = 4; echo chordCnt($N), "\n"; // This code is contributed by Ryuga ?>
Javascript
<script> // JavaScript code to count ways // to divide circle using // N non-intersecting chords. function chordCnt( A){ // n = no of points required var n = 2 * A; // dp array containing the sum var dpArray = Array(n+1).fill(0); dpArray[0] = 1; dpArray[2] = 1; for (var i=4;i<=n;i+=2){ for (var j=0;j<i-1;j+=2){ dpArray[i] += (dpArray[j]*dpArray[i-2-j]); } } // returning the required number return dpArray[n]; } // Driver function var N; N = 2; document.write( chordCnt( N) + '<br>'); N = 1; document.write( chordCnt( N) + '<br>'); N = 4; document.write( chordCnt( N) + '<br>'); </script>
Producción:
2 1 14
Complejidad de Tiempo: O(n 2 )
Espacio Auxiliar: O(n)
Sugiera si alguien tiene una mejor solución que sea más eficiente en términos de espacio y tiempo.
Este artículo es una contribución de Aarti_Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por Abhishek Sharma 44 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA