C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++ですべてのノードを接続するために重複しないエッジを配置できる方法の数をカウントするプログラム


循環的に配置されたノードの数を表す数nがあるとします。すべてのノードがエッジで接続され、エッジが互いに交差しないように、n/2個のエッジを配置できる方法の数を見つける必要があります。答えが非常に大きい場合は、結果mod 10 ^ 9+7を返します。

したがって、入力がn =4の場合、出力は2になります。これは、以下のようにグループ化できるためです-

これを解決するには、次の手順に従います-

  • サイズ(n / 2 + 1)の配列dpを定義します

  • dp [0]:=1、dp [1]:=1

  • m:=10 ^ 9 + 7

  • 初期化i:=2の場合、i <=n / 2の場合、更新(iを1増やします)、実行-

    • 高:=i

    • dp [i]:=0

    • 初期化j:=1の場合、j <=high / 2の場合、更新(jを1増やします)、実行-

      • dp [i]:=(dp [i] +(2 * dp [j --1] * dp [high --j]))mod m

    • 高い%2がゼロ以外の場合、-

      • dp [i]:=(dp [i] +(dp [(high-1)/ 2] * dp [(high-1)/ 2]))mod m

    • dp [i]:=dp [i] mod 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

  1. サイズdで作成できる十二角形の数をカウントするC++プログラム

    数dがあるとします。正方形のタイルと辺の長さが1の通常の三角形のタイルが無数にあると考えてください。これらのタイルを使用して、側面dの通常の十二角形(12辺の多角形)を形成できる方法をいくつ見つける必要があります。答えが大きすぎる場合は、結果mod998244353を返します。 ステップ これを解決するために、次の手順に従います- b := floor of d/2 - 1 c := 1 for initialize i := 2, when i < d, update (increase i by 1), do:    b := b * (floor of

  2. C++プログラムでN×3グリッドをペイントする方法の数

    サイズがnx3のグリッドがあり、グリッドのすべてのセルを3色のうちの1つだけでペイントするとします。ここで使用される色は、赤、黄、緑です。 ここで、2つの隣接するセルが同じ色を持たないという制約があります。グリッドの行数はn個です。最後に、このグリッドをペイントする方法の数を見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。 したがって、入力が1のような場合、出力は12になります これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 retu