Estudiantes de escuela primaria Blue Bridge Cup Python avance | Fusión de piedras de anillo

¡Aprende Python de la muñeca! Registre las preguntas en el proceso de aprendizaje y preparación de pruebas de Blue Bridge Cup Python, y registre cada momento.

Se adjunta una publicación de resumen: Pupils Blue Bridge Cup Python Breakthrough | Summary_COCOgsta's Blog-CSDN Blog


【Descripción】

Organice n pilas de piedras alrededor del patio circular, y ahora las piedras deben combinarse en una pila de manera ordenada. Se estipula que solo se pueden seleccionar dos pilas adyacentes para fusionarse en una nueva pila cada vez, y el número de piedras en la nueva pila se registra como la puntuación de la fusión.

Por favor, escriba un programa para realizar los siguientes cálculos:

Elija un esquema para fusionar piedras de modo que la suma de n-1 puntajes de fusión sea la más pequeña.

Elija un plan para fusionar piedras de modo que la suma de n-1 veces de puntajes fusionados sea la mayor.

【Ingresar descripción】

La primera línea contiene un número entero n, lo que indica que hay n montones de piedras en total. 1≤n≤200

La segunda línea contiene n enteros, que representan respectivamente el número de piedras en cada pila.

【Descripción de salida】

Hay dos líneas de salida:

La primera línea es la suma mínima de puntajes combinados,

La segunda línea es el valor máximo de la suma de puntuación combinada.

【Entrada de muestra】

5

1 4 2 5 3

【Salida de muestra】

34

47

【Explicación del código】

n = int(input())
a = [0]

for i in input().split():
    a.append(int(i))

for i in range(1, n+1):
    a.append(a[i])
s = [0]
f = [[1061109567 for j in range(201)] for i in range(201)]
g = [[0 for j in range(310)] for i in range(310)]

for i in range(1, 2*n+1):
    s.append(s[i-1] + a[i])
    f[i][i] = 0
    g[i][i] = 0

for len in range(2, n+1):
    for l in range(1, 2*n+1):
        r = l + len - 1
        if r <= 2*n:
            for k in range(l, r):
                f[l][r] = min(f[l][r], f[l][k] + f[k+1][r] + s[r] - s[l - 1])
                g[l][r] = max(g[l][r], g[l][k] + g[k+1][r] + s[r] - s[l - 1])

minv = 1061109567
maxv = 0
for i in range(1, n+1):
    minv = min(minv, f[i][i+n-1])
    maxv = max(maxv, g[i][i+n-1])

print(minv)
print(maxv)
复制代码

【resultado de la operación】

5
1 4 2 5 3
34
47

Supongo que te gusta

Origin blog.csdn.net/guolianggsta/article/details/130167505
Recomendado
Clasificación