2017-07-21 4 views
2

これはDPの問題です。これはPythonで2D配列を使って解決します。異なる方法で2D配列を生成する

問題は私が2D配列を生成する方法です。

標準溶液:

def getFloor(F, c, d): 
    if d == 0 or c == 0: 
     return 0 
    if c == 1: 
     return d 
    if F[c][d] == -1: 
     F[c][d] = getFloor(F, c, d-1) + getFloor(F, c-1, d-1) + 1 
    return F[c][d] 

def getMaxFloor(c,d): 
    F = [[-1] * (d + 1) for i in range(c + 1)] 
    ans = getFloor(F, c, d) 
    return ans 

print(getMaxFloor(3,4)) #prints 14 

マイコード:

def getFloor(F, c, d): 
    if d == 0 or c == 0: 
     return 0 
    if c == 1: 
     return d 
    if F[c][d] == -1: 
     F[c][d] = getFloor(F, c, d-1) + getFloor(F, c-1, d-1) + 1 
    return F[c][d] 

def getMaxFloor(c,d): 
    F = [[-1] * (d + 1)] * (c+1) 
    ans = getFloor(F, c, d) 
    return ans 

print(getMaxFloor(3,4)) #prints 15, instead of the correct answer 14 

Iはtrueを返し、両方が初期化されたアレイF、の両方をチェック。 どうしたのですか?

答えて

4

私は、あなたがそれを掛け合わせると、同じリスト要素への重複または参照を作成しているということを推測しています。だから、あなたが1つを変えたら、あなたはもう1つを変えます。一方、forループを使用すると、別のリンクされていないインスタンスが作成されるため、変更されたときに他のインスタンスに影響することはありません。 (答えが正確に1である理由を正確に把握するためには、多くのバックトレースなどが必要です)。しかし、これは実際にコード間​​の唯一の違いです。問題でなければなりません。お役に立てれば。例えば

l = [1,2,3] 
a = [2] 
l.append(a) 
a[0] = 4 
print l 
>>>[1, 2, 3, [4]] 

注意Lの最後の要素であること[4]の代わりに[2]。

+1

正解であることを理由に、なぜこれが嫌いなのか分かりません。 – meowgoesthedog

+2

ikr :(人々は嫌な幸福です –

+0

あなたの答えにコード例を含めると、質問者(そしてサイトの他の誰か)にもっとアクセスしやすくなると思います。 – SeeDerekEngineer

関連する問題