Este es un seguimiento de las matrices de recuento que hacen conjuntos únicos . La diferencia significativa es la definición de unicidad.
Considere una variedad A
de longitud n
. La matriz contiene solo enteros positivos. Por ejemplo A = (1,1,2,2)
. Definamos f(A)
como el conjunto de sumas de todos los subconjuntos contiguos no vacíos de A
. En este caso f(A) = {1,2,3,4,5,6}
. Los pasos para producir f(A)
son los siguientes:
Las submatrices de A
son (1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)
. Sus sumas respectivas son 1,1,2,2,2,3,4,4,5,6
. El conjunto que obtienes de esta lista es por lo tanto {1,2,3,4,5,6}
.
Llamamos a una matriz A
única si no hay otra matriz B
de la misma longitud que f(A) = f(B)
, excepto por la matriz A
invertida. Como ejemplo, f((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}
pero no hay otra matriz de longitud 3
que produzca el mismo conjunto de sumas.
Tarea
La tarea, para un dado n
y s
es contar el número de matrices únicas de esa longitud. Puede suponer que s
está entre 1
y 9
. Solo necesita contar matrices donde los elementos son un número entero dado s
o s+1
. Por ejemplo, si s=1
las matrices que está contando solo contienen 1
y 2
. Sin embargo, la definición de unicidad es con respecto a cualquier otra matriz de la misma longitud. Como ejemplo concreto no[1, 2, 2, 2]
es único, ya que da el mismo conjunto de sumas que .[1, 1, 2, 3]
Debe contar el reverso de una matriz, así como la matriz misma (siempre que la matriz no sea un palíndromo, por supuesto).
Ejemplos
s = 1
, las respuestas para n = 2,3,4,5,6,7,8,9 son:
4, 3, 3, 4, 4, 5, 5, 6
Para s = 1
, las matrices únicas de longitud 4 son
(1, 1, 1, 1)
(2, 1, 1, 2)
(2, 2, 2, 2)
s = 2
, las respuestas para n = 2,3,4,5,6,7,8,9 son:
4, 8, 16, 32, 46, 69, 121, 177
Un ejemplo de una matriz que no es única con s = 2
es:
(3, 2, 2, 3, 3, 3).
Tiene el mismo conjunto de sumas que ambas: (3, 2, 2, 2, 4, 3)
y (3, 2, 2, 4, 2, 3)
.
s = 8
, las respuestas para n = 2,3,4,5,6,7,8,9 son:
4, 8, 16, 32, 64, 120, 244, 472
Puntuación
Para un determinado n
, su código debe generar la respuesta para todos los valores de s
from 1
a 9
. Su puntaje es el valor más alto n
para el cual esto se completa en un minuto.
Pruebas
Necesitaré ejecutar su código en mi máquina ubuntu, así que incluya las instrucciones más detalladas posibles sobre cómo compilar y ejecutar su código.
Tabla de clasificación
- n = 13 por Christian Sievers en Haskell (42 segundos)
fuente
s
? ¿Que representa?Respuestas:
Haskell
La
orig
función crea todas las listas de longitudn
con entradass
os+1
, las mantiene si vienen antes de su reversa, calcula su sublistasums
y las coloca en un mapa que también recuerda el primer elemento de la lista. Cuando se encuentra el mismo conjunto de sumas más de una vez, se reemplaza el primer elementoNothing
, por lo que sabemos que no tenemos que buscar otras formas de obtener estas sumas.La
construct
función busca listas de longitud dada y valor inicial dado que tienen un conjunto dado de sumas de sublista. Su parte recursivaconstr
sigue esencialmente la misma lógica que esta , pero tiene un argumento adicional que proporciona la suma que deben tener las entradas de lista restantes. Esto permite detenerse temprano cuando incluso los valores más pequeños posibles son demasiado grandes para obtener esta suma, lo que dio una mejora masiva en el rendimiento. Se obtuvieron grandes mejoras adicionales moviendo esta prueba a un lugar anterior (versión 2) y reemplazando la lista de sumas actuales por unaVector
(versión 3 (rota) y 4 (con rigor adicional)). La última versión realiza la prueba de membresía establecida con una tabla de búsqueda y agrega más rigor y paralelización.Cuando
construct
ha encontrado una lista que da las sumas de la sublista y es más pequeña que su reverso, podría devolverla, pero no estamos realmente interesados en ella. Casi bastaría con volver()
para indicar su existencia, pero necesitamos saber si tenemos que contarlo dos veces (porque no es un palíndromo y nunca manejaremos su reversa). Entonces ponemos 1 o 2 como suweight
en la lista de resultados.La función
count
pone estas partes juntas. Para cada conjunto de sumas sublista (procedente deorig
) que era único entre las listas que contienen solamentes
ys+1
, llamavalue
, que llamaconstruct
y, a través deuniqueval
, comprueba si sólo hay un resultado. Si es así, ese es el peso que tenemos que contar, de lo contrario, el conjunto de sumas no era único y se devuelve cero. Tenga en cuenta que debido a la pereza,construct
se detendrá cuando haya encontrado dos resultados.La
main
función maneja IO y el ciclo des
1 a 9.Compilar y ejecutar
En debian esto necesita los paquetes
ghc
,libghc-vector-dev
ylibghc-parallel-dev
. Guarde el programa en un archivoprog.hs
y compíleloghc -threaded -feager-blackholing -O2 -o prog prog.hs
. Ejecute con./prog <n> +RTS -N
dónde<n>
está la longitud de la matriz para la que queremos contar las matrices únicas.fuente