C++でのDIシーケンスの有効な順列
文字列Sがあるとします。これは、セット{'D'、'I'}の文字列です。 (Dは「減少」を意味し、Iは「増加」を意味します)
ここで、有効な順列が{0からn}の整数の順列P [0]、P [1]、...、P [n]であると考えてください。これにより、すべてのiについて、次のルールが満たされます。
-
S [i] =='D'の場合、P [i]> P [i + 1];
-
それ以外の場合、S [i] =='I'の場合、P [i]
有効な順列がいくつあるかを見つける必要がありますか?答えは非常に大きい可能性があるため、mod 10 ^ 9+7を使用して戻ります。
したがって、入力が「IDD」のような場合、出力は3になります。したがって、3つの異なる順列があり、これらは(0,3,2,1)、(1,3,2,0)、( 2,3,1,0)。
これを解決するには、次の手順に従います-
-
n:=Sのサイズ
-
サイズ(n + 1)x(n + 1)の2D配列dpを1つ定義します
-
初期化j:=0の場合、j <=nの場合、更新(jを1増やします)、実行-
-
dp [0、j]:=1
-
-
初期化i:=0の場合、i
-
S[i]が'I'と同じ場合、-
-
初期化j:=0、curr:=0の場合、j
-
curr:=(dp [i、j] + curr)mod m
-
dp [i + 1、j] =(dp [i + 1、j] + curr)
-
-
-
それ以外の場合
-
初期化j:=n --i --1、curr:=0の場合、j> =0の場合、更新(jを1つ減らす)、実行-
-
curr:=(dp [i、j + 1] + curr)mod m
-
dp [i + 1、j] =(dp [i + 1、j] + curr)
-
-
-
-
dp [n、0]
を返します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; const int m = 1e9 + 7; class Solution { public: int numPermsDISequence(string S) { int n = S.size(); vector<vector<int>> dp(n + 1, vector<int>(n + 1)); for (int j = 0; j <= n; j++) dp[0][j] = 1; for (int i = 0; i < n; i++) { if (S[i] == 'I') { for (int j = 0, curr = 0; j < n - i; j++) { curr = (dp[i][j] + curr) % m; dp[i + 1][j] = (dp[i + 1][j] + curr) % m; } } else { for (int j = n - i - 1, curr = 0; j >= 0; j--) { curr = (dp[i][j + 1] + curr) % m; dp[i + 1][j] = (dp[i + 1][j] + curr) % m; } } } return dp[n][0]; } }; main(){ Solution ob; cout << (ob.numPermsDISequence("IDD")); }
入力
"IDD"
出力
3
-
C++での対
プログラミングのループ コードのブロックを複数回計算するために使用されます。ここでは、プログラム内の2種類のループ、ForループとWhileループの違いを確認します。 。 Forループ For Loopは、ユーザーが特定のコードブロックを特定の回数までループできるようにする一種の繰り返し制御ループです。 構文 for(initisation; condition; update){ …code to be repeated } ループ中 whileループは、入力制御ループの一種であり、ユーザーは、指定された条件が真になるまで、指定されたステートメント
-
C++で有効な数独
数独と呼ばれる9×9のマトリックスを与えたとしましょう。タスクは、指定された数独パターンが有効かどうかを確認することです。 一般的に、数独ボードは次のようになります 数独のルール − すべての行には、1〜9の範囲の数値が含まれています すべての列には、1〜9の範囲の数字が含まれています。 3×3の各ブロックには一意の番号が含まれています。 特定の行に同じ番号を付けることはできません。 特定の列に同じ番号を付けることはできません。 例 入力-1 − sudoku[]= [["3","5&q