El segundo partido provincial de la 11th Blue Bridge Cup python group-digital triangle

1. Descripción del problema: La
figura anterior muestra un triángulo digital. Hay muchos caminos diferentes desde la parte superior hasta la parte inferior del triángulo. Para cada ruta, sume los números en la ruta para obtener una suma. Su tarea es encontrar la suma más grande. Cada paso en el camino solo puede ir de un número al número de la izquierda o la derecha del siguiente nivel más cercano a él. Además, la diferencia entre el número de veces que se baja a la izquierda y el número de veces que se baja a la derecha no puede exceder de uno.
[Formato de entrada]
La primera línea de entrada contiene un número entero N (1 <N ≤ 100), que representa el número de líneas triangulares. Las siguientes N líneas dan el triángulo digital.
Los números del triángulo digital son todos números enteros entre 0 y 100.
[Formato de salida]
Genera un número entero para indicar la respuesta.
[Entrada de muestra]
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
[Salida de muestra]
27

2. Análisis de pensamiento:

Al analizar la pregunta, puede saber que esta pregunta es similar a la pregunta regular del triángulo digital anterior, pero esta pregunta tiene una restricción adicional de que la diferencia entre el número de veces para ir a la parte inferior izquierda y la parte inferior derecha no puede exceder 1. En De hecho, este problema está resuelto. Los puntos clave de la pregunta también están aquí. Después de leer algunas ideas en línea y luego dibujar algunos ejemplos simples para probar los caminos que se pueden tomar, finalmente podemos encontrar que la respuesta está relacionada con la paridad del N que ingresamos. Cuando el ingreso N es Cuando el número es impar, la respuesta final es dp [n-1] [n // 2], cuando el número es par, es max (dp [n-1] [n // 2-1], dp [n-1] [n // 2]), que es el mayor de los dos valores medios. El siguiente N es el camino que se puede tomar cuando es par e impar. Puede encuentra que la respuesta final está en la matriz dp obtenida del triángulo digital original El valor dp en el medio de la última línea. Por lo tanto, el camino que se puede tomar de acuerdo con las limitaciones del sujeto se vuelve limitado. A veces es necesario hacer más dibujos de acuerdo con las condiciones del problema para encontrar dónde está el avance.

3. El código es el siguiente:

if __name__ == '__main__':
    n = int(input())
    matrix = list()
    for i in range(n):
        # 使用map函数将输入的字符串中的数字转为int类型, 最终使用list方法将其转换为一个列表
        matrix.append(list(map(int, input().split())))
    dp = [[0] * n for i in range(n)]
    dp[0][0] = matrix[0][0]
    for i in range(1, n):
        for j in range(i + 1):
            # 第一列
            if j == 0:
                dp[i][j] = dp[i - 1][j] + matrix[i][j]
            # 最后一列
            elif j == i:
                dp[i][j] = dp[i - 1][j - 1] + matrix[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + matrix[i][j]
    # print(dp)
    # 最后判断n是奇数还是偶数来返回对应的值
    # 奇数肯定是最中间的那个值偶数肯定是中间两个较大值
    print(dp[n - 1][n // 2] if n % 2 == 1 else max(dp[n - 1][n // 2 - 1], dp[n - 1][n // 2]))

 

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/114991927
Recomendado
Clasificación