WaysIIをC++でデコードする
次のマッピング方法を使用して、A〜Zの文字が数字にエンコードされているというメッセージがあるとします-
'A'-> 1、'B'-> 2、...、'Z'-> 26
これで、エンコードされた文字列に文字「*」を含めることもできます。これは、1〜9の数字の1つとして扱うことができます。したがって、数字と文字「*」を含むエンコードされたメッセージがある場合は、それをデコードする方法の総数。答えが非常に長い場合は、mod 109+7を使用して最終結果を得ることができます。したがって、入力が*のみの場合、9つの方法が考えられます。これらはすべて、1から9までの数字なので、AからIです。
これを解決するには、次の手順に従います-
- 関数add()を定義します。これには、a、b、 が必要です。
- return((a mod m)+(b mod m))mod m
- 関数mul()を定義します。これには、a、b、 が必要です。
- return((a mod m)*(b mod m))mod m
- メインの方法から次のようにします-
- n:=sのサイズ
- サイズn+1の配列dpを定義します
- dp [0]:=1
- s[0]が'0'と同じ場合、-
- 0を返す
- dp [1]:=s[0]が'*'と同じ場合は9、それ以外の場合は1
- iを初期化する場合:=2、i <=nの場合、更新(iを1つ増やす)、実行-
- 最初の:=s [i-2]、2番目の:=s [i-1]
- secondが'*'と同じ場合、-
- dp [i]:=add(dp [i]、mul(9、dp [i-1]))
- それ以外の場合、2番目の> '0'の場合、-
- dp [i]:=dp [i-1]
- 最初が'*'と同じ場合、-
- secondが'*'と同じ場合、-
- dp [i]:=add(dp [i]、mul(15、dp [i-2]))
- それ以外の場合、2番目の<='6'の場合、-
- dp [i]:=add(dp [i]、mul(2、dp [i-2]))
- それ以外の場合
- dp [i]:=add(dp [i]、mul(1、dp [i-2]))
- secondが'*'と同じ場合、-
- それ以外の場合、最初が「1」と同じか、最初が「2」と同じである場合、次に-
- secondが'*'と同じ場合、-
- 最初が「1」と同じ場合、-
- dp [i]:=add(dp [i]、mul(9、dp [i-2]))
- それ以外の場合、最初が「2」と同じである場合、次に-
- dp [i]:=add(dp [i]、mul(6、dp [i-2]))
- 最初が「1」と同じ場合、-
- それ以外の場合、(最初の-'0')* 10 +(2番目の-'0')<=26の場合、-
- dp [i]:=add(dp [i]、dp [i-2])
- secondが'*'と同じ場合、-
- return dp [n]
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; const lli m = 1e9 + 7; class Solution { public: lli add(lli a, lli b){ return ((a % m) + (b % m)) % m; } lli mul(lli a, lli b){ return ((a % m) * (b % m)) % m; } int numDecodings(string s) { int n = s.size(); vector <int> dp(n + 1); dp[0] = 1; if(s[0] == '0') return 0; dp[1] = s[0] == '*' ? 9 : 1; for(int i = 2; i <= n; i++){ char first = s[i - 2]; char second = s[i - 1]; if(second == '*'){ dp[i] = add(dp[i], mul(9, dp[i - 1])); }else if(second > '0'){ dp[i] = dp[i - 1]; } if(first == '*'){ if(second == '*'){ dp[i] = add(dp[i], mul(15, dp[i - 2])); }else if (second <= '6'){ dp[i] = add(dp[i], mul(2, dp[i - 2])); }else{ dp[i] = add(dp[i], mul(1, dp[i - 2])); } }else if(first == '1' || first == '2'){ if(second == '*'){ if(first == '1'){ dp[i] = add(dp[i], mul(9, dp[i - 2])); }else if(first == '2'){ dp[i] = add(dp[i], mul(6, dp[i - 2])); } }else if((first - '0') * 10 + (second - '0') <= 26){ dp[i] = add(dp[i], dp[i - 2]); } } } return dp[n]; } }; main(){ Solution ob; cout << (ob.numDecodings("2*")); }
入力
“2*”
出力
15
-
C++プログラムでN×3グリッドをペイントする方法の数
サイズがnx3のグリッドがあり、グリッドのすべてのセルを3色のうちの1つだけでペイントするとします。ここで使用される色は、赤、黄、緑です。 ここで、2つの隣接するセルが同じ色を持たないという制約があります。グリッドの行数はn個です。最後に、このグリッドをペイントする方法の数を見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。 したがって、入力が1のような場合、出力は12になります これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 retu
-
C++でN×3グリッドをペイントする方法の数
サイズnx3のグリッドがあり、グリッドの各セルを3色のうちの1つだけでペイントするとします。色は赤、黄、緑です。これで、隣接する2つのセルが同じ色にならないという制約があります。グリッドの行数はnです。このグリッドをペイントする方法の数を見つける必要があります。答えは非常に大きい可能性があるため、10 ^ 9+7を法として返します。 したがって、入力が1のような場合、出力は12になります これを解決するには、次の手順に従います- m =1 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 return((a mod m)+(b mod m