По просьбе Люка и дополнению Питера Тейлора к этому вызову.
Введение
Все знают игру в крестики-нолики, но в этой задаче мы собираемся внести небольшой поворот. Мы будем использовать только крестики . Первый человек, который ставит три креста подряд, проигрывает. Интересен тот факт, что максимальное количество крестов, прежде чем кто-то проиграет, равно 6 :
X X -
X - X
- X X
Это означает, что для доски 3 x 3 максимальная сумма равна 6 . Поэтому для N = 3 нам нужно вывести 6.
Другой пример, для N = 4 или для доски 4 x 4:
X X - X
X X - X
- - - -
X X - X
Это оптимальное решение, вы можете видеть, что максимальное количество крестов равно 9 . Оптимальное решение для доски 12 x 12:
X - X - X - X X - X X -
X X - X X - - - X X - X
- X - X - X X - - - X X
X - - - X X - X X - X -
- X X - - - X - - - - X
X X - X X - X - X X - -
- - X X - X - X X - X X
X - - - - X - - - X X -
- X - X X - X X - - - X
X X - - - X X - X - X -
X - X X - - - X X - X X
- X X - X X - X - X - X
Это приводит к 74 .
Задание
Ваша задача - как можно быстрее вычислить результаты. Я буду запускать ваш код в тестовом случае 13
. Это будет сделано 5 раз, а затем будет взято среднее значение времени выполнения. Это ваш окончательный счет. Чем ниже, тем лучше.
Контрольные примеры
N Output
1 1
2 4
3 6
4 9
5 16
6 20
7 26
8 36
9 42
10 52
11 64
12 74
13 86
14 100
15 114
Более подробную информацию можно найти по адресу https://oeis.org/A181018 .
правила
- Это самый быстрый код , поэтому выигрывает самая быстрая отправка!
- Вы должны предоставить полную программу .
- Пожалуйста, также укажите, как я должен запустить программу. Я не знаком со всеми языками программирования и тем, как они работают, поэтому мне нужно немного помочь здесь.
- Конечно, ваш код должен вычислять правильный результат для каждого теста.
Материалы:
- feersum (C ++ 11): 28 с
- Питер Тейлор (Ява): 14 м 31 с
Ответы:
С ++ 11, 28 с
При этом также используется подход динамического программирования, основанный на строках. Мне потребовалось 28 секунд, чтобы бежать с аргументом 13 для меня. Мой любимый трюк -
next
функция, которая использует некоторую разбивку битов для нахождения лексикографически следующего расположения строк, удовлетворяющего маске и правилу «3 в ряду».инструкции
g++ -std=c++11 -march=native -O3 <filename>.cpp -o <executable name>
<executable name> <n>
источник
Ява, 14м 31с
По сути, это программа, которую я разместил в OEIS после того, как использовал ее для расширения последовательности, так что это хороший ориентир для других людей. Я настроил его так, чтобы в качестве первого аргумента командной строки использовался размер платы.
Сохранить в
A181018.java
; компилировать какjavac A181018.java
; беги какjava A181018 13
. На моем компьютере выполнение этого ввода занимает около 20 минут. Вероятно, стоило бы распараллелить это.источник
n=16
; Я экстраполировал, что это займет около месяцаn=17
, поэтому я не пытался запустить его для этого. Использование памяти также становилось главной неприятностью. (PS В настоящее время я использую 2 из 4 своих ядер для решения задач, не связанных с PPCG : azspcs.com/Contest/Tetrahedra/Standings )