- Code: Tout sélectionner
def bottomup(self, t, c, a, b, i=-1):
keep = [0] * len(c)
depth = len(c) - 1
while depth > i:
tmp = [0] * (depth + 1)
for k in range(i + 1, depth + 1):
if depth == k:
ab = b
elif c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
keep = tmp
depth -= 1
return keep
1: tjs avec ton i=-1 qui sert à rien, donc simplifions la tache
- Code: Tout sélectionner
def bottomup(self, t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth + 1)
for k in range(i, depth + 1):
if depth == k:
ab = b
elif c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
keep = tmp
depth -= 1
return keep
2)
tu fais ton for que sur les symboles avant et tu rajoutes apres le cas du V(depth, _)
- Code: Tout sélectionner
def bottomup(self, t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[depth], b * t[depth] + keep[depth])
keep = tmp
depth -= 1
return keep
fini
3) tu fixes la taille de tmp parce que ca représente pas la taille de ce que tu dois stocker dedans: tu dois stocker les symboles avant plus V(depth,'_') donc: depth-i+1 elem et non depth +1
- Code: Tout sélectionner
def bottomup(self, t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth -i + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[depth], b * t[depth] + keep[depth])
keep = tmp
depth -= 1
return keep
ca change probablement rien mais c'est mieux d'être précis parce que tu t'évites des emmerdes potentielles
4) tu simplifies ton problème (et c'est pas faute de le dire!):
- Code: Tout sélectionner
t = [3, 9, 3]
c = [2, 2, 2]
a, b = (2, -5)
5)tu calcules A LA MAIN
V(2,0) = max(0, A*3)
V(2,1) = max(0, A*3)
V(2,_) = 0
donc apres l'itération à n-1, tu t'attends à voir tmp == [6,6,0]
- Code: Tout sélectionner
def bottomup(t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth -i + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[depth], b * t[depth] + keep[depth])
print('depth: ', depth, tmp)
keep = tmp
depth -= 1
return keep
t = [3, 9, 3]
c = [2, 2, 2]
a, b = (2, -5)
print(bottomup(t, c, a, b))
#depth: 2 [6, 6, 0]
osef depth: 1 [24, 6]
osef depth: 0 [24]
osef [24]
c'est le cas...
tu continues à la main...
V(1,0) = max(0 + V(2,0), A*9 + V(2, 1) ) = max(6, 18+6) = 24
V(1,'_') = max(0 + V(2,'_'), B*9 + V(2, 1) ) = max( 0, -45+6 ) = 0
tu t'attends à la deuxième iteration à avoir tmp==[24,0]
OR tu as [24,6] donc la ligne tmp[depth] = max(0 + keep[depth], b * t[depth] + keep[depth]) est fausse
- Code: Tout sélectionner
...
while depth >= i:
tmp = [0] * (depth -i + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[depth], b * t[depth] + keep[depth])
if depth == 1:
print('failing for ', keep[depth], b*t[depth]+keep[depth])
print(tmp)
keep = tmp
depth -= 1
...
#failing for 6 -39
#[24, 6]
tu constates que keep[depth] vaut 6 alors que ca devrait valoir 0. donc probablement tu tapes pas sur le bon indice.
depth == 1, et tu devrais taper sur la fin de keep qui est [6,6,0]: donc depth == 2.
donc tu corriges
pour depth==1 il faut taper dans le deuxieme elem de keep
mais pour depth==2, il keep est de taille 2 et il faut taper dans le deuxieme elem (qui vaut tous 0)
donc soit tu initialises keep avec une taille 3, soit tu prends le dernier elem qui dans le cas de spécial de depth2 vaut 0
- Code: Tout sélectionner
def bottomup(t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth -i + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[len(keep)-1], b * t[depth] + keep[depth])
if depth == 1:
print('failing for ', keep[depth], b*t[depth]+keep[depth])
print(tmp)
keep = tmp
depth -= 1
return keep
t = [3, 9, 3]
c = [2, 2, 2]
a, b = (2, -5)
print(bottomup(t, c, a, b))
#failing for 6 -39
#[24, 0] <--- on a bien 0 comme attendu
#[9] <--- magic!
6) tu nettoies
- Code: Tout sélectionner
def bottomup(t, c, a, b, i=0):
keep = [0] * len(c)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth -i + 1)
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[k] = max(0 + keep[k], ab * t[depth] + keep[depth])
tmp[depth] = max(0 + keep[-1], b * t[depth] + keep[depth])
keep = tmp
depth -= 1
return keep
t = [3, 9, 3]
c = [2, 2, 2]
a, b = (2, -5)
print(bottomup(t, c, a, b))
7) tu remarques que si tu appeles ta fonction avec i=1 (pourquoi pas) alors tmp est mal rempli (puisque le premier element est accédé avec k et non 0), donc tu stockes dans tmp correctement
- Code: Tout sélectionner
def bottomup(t, c, a, b, i=0):
keep = [0] * (len(c) -i + 1)
depth = len(c) - 1
while depth >= i:
tmp = [0] * (depth -i + 1)
z = 0
for k in range(i, depth):
if c[depth] == c[k]:
ab = a
else:
ab = b
tmp[z] = max(0 + keep[z], ab * t[depth] + keep[depth-i])
z += 1
tmp[-1] = max(0 + keep[-1], b * t[depth] + keep[depth-i])
keep = tmp
depth -= 1
return keep
t = [9, 2, 7, 300, 1]
c = [2, 5, 4, 2, 1]
a, b = 2, -5
print(bottomup(t, c, a, b, 0))
t = [3, 9, 2, 7, 300, 1]
c = [2, 2, 5, 4, 2, 1]
print('next')
print(bottomup(t, c, a, b, 1))
8) enfin, on aurait pu noter que vu que tu avais écrit ta fonction pour le cas i==0, tu pouvais simplement écrire
- Code: Tout sélectionner
bottomup0...
ta fonction sans se préoccuper de i
bottomup(..., i):
t2 = t[i:]
c2 = c[i:]
bottomup0(t2,c2...)