На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Не зарегистрирован
ссылка на сообщение  Отправлено: 27.11.20 12:58. Заголовок: Задача 27-19(81) Алгоритм решения


Здравствуйте! Объясните пожалуйста алгоритм решения данной задачи.

Имеется набор данных, состоящий из целых чисел. Необходимо определить максимальное произведение подпоследовательности, состоящей из одного или более смежных элементов.

Я просто не понимаю что делает программа. Что хранят переменные dp_min и dp_max?
 Fin = open("27.txt") 

N = int( Fin.readline() )

x = int( Fin.readline() )
dp_min = dp_max = ma = x
for i in range(N-1):
x = int( Fin.readline() )

t = min( dp_min*x, min(dp_max*x, x) )

dp_max = max(dp_min*x, max(dp_max*x, x))

dp_min = t
ma = max(ma, dp_max)
# print(x, ma)

print( ma )

Fin.close()


Заранее спасибо.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 4 [только новые]





Сообщение: 2
ссылка на сообщение  Отправлено: 27.11.20 16:59. Заголовок: Еще раз здравствуйте..


Еще раз здравствуйте! Я не халявщик, я разобраться хочу.

Вот мой вариант программы:

def chet(a,b):
c=0
for i in range (a,b):
if masz==1:
c=c+1
return(c%2)


def prom(n1,n2):
if chet(n1,n2)==0:
mm=1
for i in range(n1,n2):
mm=mm*masf
else:
min1=0
minp=0
flag=n1+1
while flag!=0:
if masz[flag-1]==1:
min1=flag-1
flag=-1
flag=flag+1
flag=n2
while flag!=0:
if masz[flag-1]==1:
minp=flag-2
flag=1
flag=flag-1
mm1=1
mm2=1
for i in range (minp):
mm1=mm1*masf
for i in range(min1+1,N):
mm2=mm2*masf
mm=max(mm1,mm2)
return(mm)

Fin = open("27-19b.txt")

N = int( Fin.readline() )
print(N)
masf=[]
#Содержит значения текстового файла
masz=[0]*N
#Содержит информацию о отрицательных числах
mas0=[0]*N
#Содержит информацию о числе 0

for i in range(N):
x=(int( Fin.readline() ))
masf.append(x)
if x<0:
masz=1
elif x==0:
mas0=1
print(masf,masz,mas0)
Fin.close()

print()



#Вариант когда 0 отсутствует и количество отрицателных чисел четное

if max(mas0)==0 and sum(masz)%2==0:
mm=prom(0,N)

#Вариант когда 0 отсутствует и количество отрицательных чисел нечетное

elif max(mas0)==0 and sum(masz)%2==1:
mm=prom(0,N)
#Вариант когда есть хотя бы 1 элемент равный 0
else:
nn=0
mm=0
mmt=0
for i in range(N):
if mas0==1:
mmt=prom(nn,i)
nn=i+1
if mm<mmt:
mm=mmt

print(mm)


Вот вариант программы, предложенный одним из учеников:

f = open('numbers.txt', 'r')
N = int(f.readline())
nums = ''.join(f.readlines())
nums = nums.split('0\n')
minusAmount = []
result = []
for i in range(len(nums)):
minusAmount.append(nums.count('-'))
nums = nums.split('\n')
for i in range(len(nums)):
if minusAmount % 2 == 0:
m = 1
for k in nums:
m *= int(k)
result.append(m)
else:
m1 = 1
m2 = 1
c = 0
for k in nums:
if int(k) < 0:
c += 1
if c < minusAmount:
m1 *= int(k)
if c > 1:
m2 *= int(k)
result.append(m1)
result.append(m2)
print(max(result))

Я просто не понимаю алгоритм предложенного решения. Помогите пожалуйста разобраться.
Спасибо

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Сообщение: 2166
ссылка на сообщение  Отправлено: 27.11.20 17:23. Заголовок: dkonyashkin пишет: Я..


dkonyashkin пишет:
 цитата:
Я просто не понимаю алгоритм предложенного решения. Помогите пожалуйста разобраться.

Комментарии автора есть в разборе задачи 90 в этом файле. Здесь префикс "dp_" означает динамическое программирование. dp_max - это максимальное произведение, которое может быть накоплено к текущему моменту, dp_min - минимальное произведение.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
ссылка на сообщение  Отправлено: 26.03.22 17:33. Заголовок: Возможно, более понятнее будет следующая запись такого же алгоритма


#ЗАДАЧА 19

n = int(f.readline())
x = int(f.readline())

dp_min = dp_max = mx = x

for i in range(1,n):
x = int(f.readline())

if x > 0:
dp_max = max(dp_max*x,x)
dp_min = min(dp_min*x,x)

elif x < 0:
time = dp_max
dp_max = max(dp_min*x,x)
dp_min= min(time*x,x)

else: #ВВОДИТСЯ НУЛЕВОЕ ЗНАЧЕНИЕ
dp_max = dp_min = 1

mx = max(mx,dp_max)


print(mx)

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 18
ссылка на сообщение  Отправлено: 28.03.22 11:17. Заголовок: N - количество чисел..


N - количество чисел, в программе не используется, но считывать надо
x - очередное число последовательности
p - произведение всех чисел пока не встретится ноль, после нуля начинаем копить опять с 1
p0 - первое встретившееся отрицательное произведение
ma - искомое максимальное значение

 f = open('....') 
N = int( f.readline() )

p0 = p = ma = 1
for i in f:
x = int(i)
if x==0:
p0 = p = 1
else:
p*=x
if p<0 and p0==1: p0=p
ma=max(ma,p,p//p0)
print(ma)


Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 163
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет