C++のUniquePathsII
n x mグリッド(n行m列)の左上隅にロボットがあるとします。ロボットは、どの時点でも下側または右側のどちらかにしか移動できません。ロボットはグリッドの右下隅に到達しようとしています(下の図で「END」とマークされています)。
グリッド内の一部のセルがマークされており、障害物と見なされます。では、可能な一意のパスがいくつあるかを見つける必要がありますか?たとえば、グリッドが[[0,0,0]、[0,1,0]、[0,0,0]]のような場合、グリッドは次のようになります-
Robo | | |
| Obs | |
| | END |
出力は2になるため、開始位置から終了位置に到達する方法は全部で2つあります。これらのパスは-
です- 右→右→下→下
- 下→下→右→右
手順を見てみましょう-
- a:=行数、b:=列数
- grid [a – 1、b --1]がゼロ以外の場合、0を返します
- 順序がxbで、名前がDPであるテーブルを1つ作成します
- for i:=b –1から0まで
- grid [a – 1、i]の場合は中断し、そうでない場合はDP [a – 1、i]:=1
- for i:=a –1から0まで
- grid [i、b --1]の場合は中断し、そうでない場合はDP [i、b – 1]:=1
- for i:=a –2から0まで
- for j:=b –2から0まで
- DP [i、j]:=DP [i + 1、j] + DP [i、j + 1](grid [i、j]が0の場合、それ以外の場合は0
- for j:=b –2から0まで
- DP [0、0]を返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int a = obstacleGrid.size(); int b = obstacleGrid[0].size(); if(!a || !b) return 0; if(obstacleGrid[a - 1][b - 1])return 0; vector < vector <lli> > dp(a, vector <lli>(b)); for(int i = b - 1; i >= 0; i--)if(obstacleGrid[a-1][i]) break; else dp[a-1][i] = 1; for(int i = a - 1; i >= 0; i--)if(obstacleGrid[i][b - 1]) break; else dp[i][b-1] = 1 ; for(int i = a-2; i >= 0; i--){ for(int j = b-2 ; j >= 0; j--)dp[i][j] = !obstacleGrid[i][j]? dp[i+1][j] + dp[i][j+1] : 0; } return dp[0][0]; } }; main(){ Solution ob; vector<vector<int>> v = {{0,0,0},{0,1,0},{0,0,0}}; cout << ob.uniquePathsWithObstacles(v); }
入力
[[0,0,0],[0,1,0],[0,0,0]]
出力
2
-
C++のユニークな二分探索木
整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を数える必要があります。したがって、入力が3の場合、ツリーは– になるため、出力は5になります。 これを解決するには、次の手順に従います– サイズn+1の配列を1つ作成します dp [0]:=1 for i:=1からn for j:=0 to i – 1 dp [i]:=dp [i] +(dp [i – 1 – j] * dp [j]) return dp [n] 例(C ++) 理解を深めるために、次の実装を見てみましょう- #include <bits/stdc++.h
-
C++でのユニークな二分探索木II
整数nがあるとすると、1からnまでの値を格納する構造的に一意のすべての二分探索木を生成する必要があります。したがって、入力が3の場合、ツリーは-になります。 これを解決するには、次の手順に従います- generate()と呼ばれる1つの再帰関数を定義します。これには、低くても高くてもかまいません。 tempと呼ばれる1つのツリーノードを定義します。 高い場合は、一時にnullを挿入し、一時を返します 低から高の範囲のiの場合 left_subtree:=generate(low、i – 1) right_subtree:=generate(i + 1、high) 現在:=i