Название Описание
«Дешево купить» Эту рекомендацию половины успеха правил на фондовом рынке в молочных коров. Для того, чтобы считать большой инвестор, вы должны следовать следующим советам вопрос: «купить дешево, дешево купить снова.» Каждый раз , когда вы покупаете акции, вы должны использовать меньше , чем в прошлый раз , когда вы покупаете его цену , чтобы купить его. Количество покупки, тем лучше! Ваша цель состоит в том, чтобы следовать приведенным выше рекомендациям при предпосылке ищет , сколько раз вы можете приобрести запасы. Вам будет предоставлена цена продажи акций (в день в течение периода времени 2 ^ {16} 2 . 1 положительное целое число в диапазоне от 6), вы можете выбрать , в какие дни позже на складе. Каждая покупка должна следовать «купить дешево, а затем купить недорогой» принцип. Напишите программу , которая вычисляет максимальное количество покупок.
Вот список цены акции:
Дата 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 0 , 1 1 , 1 2
Цена 68, 69, 54, 64, 68, 64, 70, 67, 78, 62, 98, 87 . 6 . 8 , . 6 . 9 , . 5 . 4 , . 6 . 4 , . 6 . 8 , . 6 . 4 , . 7 0 , . 6 . 7 , . 7 . 8 , . 6 2 , . 9 . 8 , . 8 . 7
Лучшие инвесторы могут приобрести до 4 четыре акции, один возможный сценарий:
Дата 2, 5, 6, 10 2 , 5 , 6 , . 1 0
Цена 69, 68, 64 и 62 . 6 . 9 , . 6 . 8 , . 6 . 4 , 6 . 2
Формат ввода
Строка 1: N (1 \ Le N \ Le 5000) N ( 1 ≤ N ≤ 5 0 0 0 ), количество дней акции выпуска
Строка 2: N число N, ежедневно цена акции.
Формат вывода
Два числа:
максимальное количество покупок и покупка имеет самое большое количество программы ( \ Le ^ {2} 31 ≤ 2 3. 1.) , Когда два вида программ «выглядит так же» время (то есть по той же цене , когда они образуют очередь) это 2 два вида программ считаются тем же самым.
Пример ввода и вывода
12 68 69 54 64 68 64 70 67 78 62 98 87
4 2
Решение: от Лос-Вэлли, Супер (синий) из заголовка DP
# include <бит / STDC ++ ч.> с использованием пространства имен STD; Const INT maxn = 5005 ; Int п, а [maxn]; INT дп [maxn]; INT F [maxn]; Int основных () { IOS :: sync_with_stdio ( ложь ), cin.tie ( 0 ), cout.tie ( 0 ); CIN >> п; для ( INT I = 1 ; г <= п; я ++ ) CIN >> а [я]; INT ANS1 = 0 , ans2 = 0 ; для ( INT I = 1 ; г <= п; я ++ ) { дп [I] = 1 ; для ( INT J = 1 , J <я; j ++ ) , если (а [я] < а [J]) { дп [I] = макс (дп [I], дп [J] + 1 ); } ANS1 = макс (ANS1, дп [I]); } для ( INT I = 1 ; г <= п; я ++ ) { если (дп [я] == 1 ) П [г] = 1 ; для ( INT J = 1 , J <я; j ++ ) , если (дп [я] == дп [J] + 1 && а [я] <а [J]) F [I] + = F [J]; остальное , если (дп [я] == дп [J] && а [я] == а [J]) П [I] = 0 ; если (дп [я] == ANS1) ans2 + = F [I]; } соиЬ << ANS1 << " " << ans2 << епсИ; }