dpの基本的な問題:2D行列の特定の点への最小コストのパスを見つける
問題の説明:
2次元配列が与えられた場合、Cost [i] [j]は座標(i、j)にアクセスするコストを表します。ソリューションは(0、0)から始まり、最小のコストで(x、y)にアクセスします。マトリックスでは、一度に1ユニットだけ下または右に移動できます。そして、すべてのコストは正の整数です。
問題分析:
制限された条件は右または下にしか移動できないため、特定の座標に到達するための最小コスト式は次のように記述できます。
MinCost(i, j) = min(MinCost(i - 1, j), MinCost(i, j - 1)) + Cost[i][j]
ここで、座標(0、0)から始めて、問題の分解を続けます。2つの特別な座標があることに気付くでしょう。
- 横軸が0の座標、つまり最上位の座標
- 縦座標が0の座標、つまり左端の座標
分析のために最初のタイプの座標を取り出します。制限により、このタイプの座標のコストは次のとおりです。
MinCost(0, j) = MinCost(0, j - 1) + Cost[0,j]
そのような座標に到達するためのコストは、知っている唯一のものであることがわかります。同様に、左端の座標も知っている唯一の座標です。
行列の最も外側の2つの辺の座標コストを知った後、すべての座標の最小コストは、レイヤーの最小コストを解くことによって1つずつ取得できます。
したがって、必要なすべての情報が取得され、ソリューションを作成できます。
アルゴリズム:
/**
*
* @param {int[][]} Cost
* @param {int} x
* @param {int} y
*/
var twodimensional = function(Cost, x, y) {
// construc MinCost dp 2-dimensional-matrix
var MinCost = new Array()
for (let i = 0; i < y; i++) {
a[i] = new Array()
for (let j = 0; j < x; j++) {
a[i][j] = 0
}
}
MinCost[0][0] = Cost[0][0]
// construct topmost cost
for (let i = 1; i < x; i++) {
MinCost[0][i] = MinCost[0][i - 1] + Cost[0][i]
}
// construct leftmost cost
for (let i = 1; i < y; i++) {
MinCost[i][0] = MinCost[i - 1][0] + Cost[i][0]
}
// find all the cost
for (let i = 1; i < x; i++) {
for (let j = 1; j < y; j++ ) {
MinCost[i][j] = Math.min(MinCost[i - 1][j], MinCost[i][j - 1]) + Cost[i][j]
}
}
return MinCost[x - 1][y - 1]
}
私たちが使用しているのはボトムアップの動的ソリューションです。理解できないことがあれば、コメントしてください。できる限りお答えします。