Форум » Динамическое программирование » Не сходится ответ к задаче 7211 » Ответить

Не сходится ответ к задаче 7211

Ж: на сайте ответ 223166 У меня получается 8538 : [pre2] f= lambda n,s,t: f(n-1,s+'-',t+[n]) + f(n-2,s+'-',t+[n]) + f(n+5,s+'+',t+[n]) + f(n*2,s+'*',t+[n]) \ if n!=50 and n<50+3 and '--' not in s and n%10!=5 else (n==50 and '--' not in s and 37 in t)*[t+[50]] s=f(7,'',[]) print(*s,len(s), sep='\n') [/pre2] Та же ситуация с заданием 7210 - мой ответ 1

Ответов - 2

Chelovegg5: Здравствуйте. Решение на паскале: function f(x,y,k:integer):integer ; [pre2]begin if (x-2>y) or (x mod 10 = 5) then f:=0 else if x=y then f:=1 else if k=1 then f:=f(x+5,y,0)+f(x*2,y,0) else f:=f(x-1,y,1)+f(x-2,y,1)+f(x+5,y,0)+f(x*2,y,0) end; begin print(f(7,37,0)*f(37,50,0)) end. [/pre2] ответ 14817. Не могли бы вы подсказать, чего я не учитываю?

Ж: В вашем коде вы не учитываете. что два минуса могут встретиться на стыке двух проходов: можно попасть в 37 вычитанием и начать с 37 тоже вычитанием. В этом случае надо либо убрать подсчет через умножение, а идти прямо из 5 в 50, отслеживая, появилось ли в траектории число 37, либо сильно усложнять код: я к примеру писала 3 функции: одна из них считала как у вас, вторая учитывала только проходы, закончившиеся вычитанием, третья - проходы. начавшиеся с вычитания. Ответом было f1(5,35)*f1(35,50)- f2(5,35)*f3(35,50) Вот ваш поправленный код без умножения. [pre2] function f(x:integer;fl:Boolean;s:ShortString):integer ; begin if (x-2>50) or (x mod 10 = 5) then f:=0 else if (x=50) and (fl) then f:=1 else if s='-' then f:=f(x+5,fl or (x=37),'1') + f(x*2,fl or (x=37),'1') else f:=f(x-1,fl or (x=37),'-') + f(x-2,fl or (x=37),'-') + f(x+5,fl or (x=37),'1')+f(x*2,fl or (x=37),'1') end; begin writeln(f(7,False,'+')) end. [/pre2]



полная версия страницы