最小コスト(すべての座標に事前定義コストがあります)のn * n行列でパスを見つけるアルゴリズムを作成しようとしています。パスコストは、すべての座標コストの合計として定義されます。最初の入力行は行列のサイズを含み、次のn行はテーブル行です。コードの最後の2行は1です。開始座標2.終了座標。出力は最小パスコストです。最小コストパスの最適化が機能しない
例入力:
5
0 1 2 1 1
0 0 1 5 1
1 0 0 1 1
1 1 0 7 0
1 8 0 0 0
0 0
4 4
出力が0
これはメモ化とコードであるべきであるが、(それがメモ化せずに動作しますが、それは遅いです)
import copy
import sys
sys.setrecursionlimit(9000)
INF = 100000
n = int(input())
memo = {}
def input_matrix(n) :
p = []
for i in range(n) :
p.append(list(map(int, input().split())))
return p
def min_cost(matrix, x, y, end_x, end_y) :
if x == end_x and y == end_y :
return 0
if (x, y) in memo :
return memo[(x, y)]
if x == len(matrix) or y == len(matrix) or x == -1 or y == -1 or matrix[y][x] == -1:
return INF
z = copy.deepcopy(matrix)
z[y][x] = -1
memo[(x, y)] = min(
min_cost(z, x+1, y, end_x, end_y)+matrix[y][x],
min_cost(z, x-1, y, end_x, end_y)+matrix[y][x],
min_cost(z, x, y+1, end_x, end_y)+matrix[y][x],
min_cost(z, x, y-1, end_x, end_y)+matrix[y][x]
)
return memo[(x, y)]
matrix = input_matrix(n)
begin_coords = list(map(int, input().split()))
end_coords = list(map(int, input().split()))
print(min_cost(matrix, begin_coords[0], begin_coords[1], end_coords[0], end_coords[1]))
あなたは少しやっていることを説明し、(小さな)サンプル入力に期待される出力を提供することができます。 –
また、これがうまくいかない最適化の場合、小さな入力で正しく動作するいくつかのコードがありますか? memoizationはあなたが言及した最適化ですか? –
コードはメモなしで正常に動作しています。 – gimli