Pythonで階段を上る方法(最大k回までの最大ステップ数)を見つけるためのプログラム
n段の階段があり、別の番号kもあるとします。最初は階段0にあり、一度に1、2、または3段の階段を上ることができます。しかし、私たちはせいぜいk回しか3つの階段を上ることができません。次に、階段を上る方法をいくつか見つける必要があります。
したがって、入力がn =5、k =2の場合、階段を上るにはさまざまな方法があるため、出力は13になります-
- [1、1、1、1、1]
- [2、1、1、1]
- [1、2、1、1]
- [1、1、2、1]
- [1、1、1、2]
- [1、2、2]
- [2、1、2]
- [2、2、1]
- [1、1、3]
- [1、3、1]
- [3、1、1]
- [2、3]
- [3、2]
これを解決するには、次の手順に従います-
- nが0と同じ場合、
- 1を返す
- nが1と同じ場合、
- 1を返す
- k:=最小k、n
- メモ:=サイズ(n + 1)x(k + 1)の行列
- 0からkの範囲のrについては、
- memo [r、0]:=1、memo [r、1]:=1、memo [r、2]:=2
- 3からnの範囲のiについては、
- memo [0、i]:=memo [0、i-1] + memo [0、i-2]
- 1からkの範囲のjについては、
- 3からnの範囲のiについては、
- count:=i/3の商
- count <=jの場合、
- メモ[j、i]:=メモ[j、i-1] +メモ[j、i-2] +メモ[j、i-3]
- それ以外の場合、
- メモ[j、i]:=メモ[j、i-1] +メモ[j、i-2] +メモ[j-1、i-3]
- 3からnの範囲のiについては、
- return memo [k、n]
理解を深めるために、次の実装を見てみましょう-
例
class Solution: def solve(self, n, k): if n==0: return 1 if n==1: return 1 k= min(k,n) memo=[[0]*(n+1) for _ in range(k+1)] for r in range(k+1): memo[r][0]=1 memo[r][1]=1 memo[r][2]=2 for i in range(3,n+1): memo[0][i]=memo[0][i-1]+memo[0][i-2] for j in range(1,k+1): for i in range(3,n+1): count = i//3 if count<=j: memo[j][i]=memo[j][i-1]+memo[j][i-2]+memo[j][i-3] else: memo[j][i]=memo[j][i-1]+memo[j][i-2]+memo[j-1][i-3] return memo[k][n] ob = Solution() print(ob.solve(n = 5, k = 2))
入力
5, 2
出力
13
-
Pythonで捕まえることができる雨の総量を見つけるためのプログラム
n個の非負の整数の配列があるとします。これらは、各バーの幅が1である高さを表しており、雨が降った後にどれだけの水を捕まえることができるかを計算する必要があります。したがって、マップは次のようになります- ここでは、8つの青いボックスがあることがわかります。したがって、出力は8になります。 これを解決するには、次の手順に従います- スタックst、water:=0およびi:=0を定義します whilei<身長のサイズ =height [i]の場合、iをスタックにプッシュし、iを1増やします それ以外の場合 x:=スタックトップ要素、スタックからトップを削除 スタックが空でない場合
-
Pythonでツリーを2つのツリーに分割できる方法の数を数えるプログラム
値0、1、および2を含む二分木があるとします。ルートには少なくとも1つの0ノードと1つの1ノードがあります。ここで、ツリーのエッジを削除し、ツリーが2つの異なるツリーになる操作があるとします。 2つのツリーのいずれにも0ノードと1ノードの両方が含まれないように、1つのエッジを削除できる方法の数を見つける必要があります。 したがって、入力が次のような場合 0から2のエッジしか削除できないため、出力は1になります。 これを解決するには、次の手順に従います- count:=[0、0、0] 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 pre:=