重複と独立は一種の衝突する意味を持っているので、これらの基準はひどく表現されていると思います。
とにかく、あなたが持っている必要があるDPアプローチを効果的に使用できるようにするために
- より単純な問題の観点から再帰的に定義できる問題
- 残りの部分の解決策が現在のポイントに到達した方法に依存しない部分的な解決策の概念
例:最初の行から始まり、次の行に各ステップがあり、同じ列または隣接する列にあるマトリックス内を移動するときの最大合計パスを計算する場合は、現在の合計を「状態」として使用できます。 、現在の行と現在の列。これは、ソリューションでは、現在の位置に到達するために使用されたパスが何であったかは問題ではないためです。
1 4 [3] 2 1 4 9
2 1 [3] 1 2 3 1
9 [8] 3 0 1 2 9
0 [0] 2 4 1 6 3
1 2 [6] 3 0 4 1
上記のスキーマでは、このパスの合計は3 + 3 + 8 + 0+6です。合計を最大化するために、特定のポイントから通過するパスの最大値を、そこに到達するための最大値、およびそこからマトリックスの最後に到達するための最大値として取得できることがわかります。したがって、解は独立したサブ問題に分割でき、行列の特定のポイントから最後までの最大合計の結果をキャッシュできます(ポイントに到達した方法とは関係ありません)。
def maxsum(x, y):
if (x, y) in cache:
return cache[(x, y)]
if y == height - 1:
return matrix[y][x]
if x == 0:
left = -1
else:
left = matrix[y][x] + maxsum(x-1, y+1)
center = matrix[y][x] + maxsum(x, y+1)
if x == width-1:
right = -1
else:
right = matrix[y][x] + maxsum(x+1, y+1)
result = cache[(x, y)] = max(left, center, right)
return result
ルールに3つ以下の「9」を追加すると、座標だけを状態として使用することはできません。これは、次のサブ問題(最後に行く)が前の問題(つまり、「9」の数)の影響を受けるためです。 「あなたはすでに中間の位置に着いている間に集めました)。
動的計画法のアプローチを引き続き使用できますが、たとえば、収集された「9」の数を現在の状態表現に追加することにより、状態空間を大きくすることができます。
def maxsum(x, y, number_of_nines):
if (x, y, number_of_nines) in cache:
return cache[(x, y, number_of_nines)]
...