Solución de programación dinámica para un juego de una pila NIM -- python campo con programming-challenge campo con time-limit-exceeded campo con dynamic-programming camp codereview Relacionados El problema

Dynamic Programming solution for one pile nim game


-2
vote

problema

Español

He resuelto el siguiente problema utilizando la programación dinámica: Little Deepu y su novia 1 . Parafrasearse,

Tenemos dos jugadores Little Deepu y Kate y M Artículos en la bolsa B, También tenemos un juego de juegos S con n elementos, cada elemento del juego es un entero. El juego se juega de la siguiente manera, cada jugador se hace pasar a Elija un elemento del juego S y elimina ese número de artículos de la bolsa, el jugador que no puede eliminar los artículos de la La bolsa suelta el juego. Little Deepu comienza el juego, si ambos pequeños deepu y Kate juega el juego de manera óptima, tu tarea es determinar quién gana el juego.

entrada: La primera línea contiene un número entero, número de casos de prueba. Cada caja de prueba contiene dos líneas, la primera línea contiene dos enteros M y N y la segunda línea contienen elementos de s.

Salida: Para cada caso de prueba, nombre de impresión del ganador del juego.

Aunque correcto, mi solución está excediendo el límite de tiempo para grandes entradas. Por favor, dime a dónde me voy mal.

  def winner(n_i, n_t, t_k):     output = [False]*(n_i + 1)     for j in t_k:         output[j    ] = True     print(output)     for i in range(1, n_i + 1):         if not output[j]:             for j in t_k:                 if j > i:                     continue                 val = output[i - j]                 if not val:                     output[i] = True                     break     return 'Little Deepu' if output[n_i] else 'Kate'   num_test = int(input())  for i in range(num_test):     num_items,num_take_outs = map(int, input().split())     take_outs = list(map(int, input().split()))     print(winner(num_items, num_take_outs, take_outs))   
Original en ingles

I have solved the following problem using dynamic programming: Little Deepu and his Girlfriend 1. To paraphrase,

We have two players Little Deepu and Kate and M items in the bag B, also we have a game set S with N elements, each element of game set is an integer. The game is played as follows, each player takes turn to pick an element from the game set S and removes that number of items from the bag, the player that is unable to remove the items from the bag looses the game. Little Deepu start the game ,If both Little Deepu and Kate play the game optimally, your task is to determine who wins the game.

Input: First line contains a integer T , number of test cases. Each test case contain two lines , first line contain two integer M and N and second line contain elements of S.

Output: For each test case print name of the winner of the game .

Though correct, my solution is exceeding time limit for large inputs. Please tell me where I am going wrong.

def winner(n_i, n_t, t_k):     output = [False]*(n_i + 1)     for j in t_k:         output[j    ] = True     print(output)     for i in range(1, n_i + 1):         if not output[j]:             for j in t_k:                 if j > i:                     continue                 val = output[i - j]                 if not val:                     output[i] = True                     break     return 'Little Deepu' if output[n_i] else 'Kate'   num_test = int(input())  for i in range(num_test):     num_items,num_take_outs = map(int, input().split())     take_outs = list(map(int, input().split()))     print(winner(num_items, num_take_outs, take_outs)) 
           
 
 

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

La percepción clave es que no tuve que verificar si alguna de las opciones realizadas en la posición actual, diga x, desde el juego de juegos, conduzca a una posición, digamos x -s i , Eso garantizará una pérdida para el oponente. Para cualquier posición que conduzca a la pérdida, tuve que marcar todas las posiciones adicionales que se encuentran a partir de la posición actual utilizando todas las selecciones de los subconómugos como posiciones ganadoras. A continuación se muestra el código:

  def winner(n_i, n_t, t_k):     output = [False]*(n_i + 1)     for j in t_k:         output[j] = True     for i in range(1, n_i + 1):         if output[i]:             continue         for j in t_k:             if i+j < n_i +1:                 output[i+j] = True     return 'Little Deepu' if output[n_i] else 'Kate'   num_test = int(input())  for i in range(num_test):     num_items,num_take_outs = map(int, input().split())     take_outs = list(map(int, input().split()))     print(winner(num_items, num_take_outs, take_outs))   
 

The key insight is that I didn't have to check if any of the choices made at current position, say x, from game set S lead to a position, say x -Si , that will guarantee a loss for the opponent.Rather for any position that leads to loss I had to mark all further positions reachable from the current position using all the selections from the subset S as winning positions. Following is the code:

def winner(n_i, n_t, t_k):     output = [False]*(n_i + 1)     for j in t_k:         output[j] = True     for i in range(1, n_i + 1):         if output[i]:             continue         for j in t_k:             if i+j < n_i +1:                 output[i+j] = True     return 'Little Deepu' if output[n_i] else 'Kate'   num_test = int(input())  for i in range(num_test):     num_items,num_take_outs = map(int, input().split())     take_outs = list(map(int, input().split()))     print(winner(num_items, num_take_outs, take_outs)) 
 
 

Relacionados problema

4  Calculando la suma de elementos de matriz a la izquierda y derecha  ( Calculating the sum of array elements to the left and right ) 
Estoy usando C ++ para codificar la siguiente lógica: Se da una matriz. Tenemos que atravesar la matriz de tal manera que la suma de elementos de matriz a ...

7  LEETCODE: BURCO BALLOONS C #  ( Leetcode burst balloons c ) 
https://leetcode.com/problems/burst-balloons/ Dado n globos, indexados de 0 a 9988777665544332 , cada globo está pintado con Un número en él repre...

3  Problema de Knapsack01, escrito en C #  ( Knapsack01 problem written in c ) 
¿Este código está escrito en un estilo decente? Aprecie algunos comentarios :) ShopItemCategory4 ...

8  Manejo del estado compartido entre muchos elementos en angular  ( Handling shared state among a lot of elements in angular ) 
Estoy trabajando en un proyecto en angular donde tengo un número de objetos de datos similares. Cuando hace clic en alguien de ellos, su estado y la cantidad ...

6  UVA 100: "El problema 3n + 1"  ( Uva 100 the 3n 1 problem ) 
He resuelto el problema de la UVA 100: el problema 3n + 1 . En resumen, la tarea era escribir un programa que calcula un máximo de longitudes de secuencia de...

11  Substitution Cipher Algorithm Rendimiento Boost  ( Substitution cipher algorithm performance boost ) 
Este algoritmo está destinado a leer una cadena de números en una entrada, un código de cifrado de sustitución ingenuo (A = 1, B = 2, ..., z = 26) y salga de ...

11  Desafío de optimización para colorear por casa  ( House coloring optimization challenge ) 
Tengo una entrevista en las próximas semanas, y estoy eligiendo ser entrevistado en Python. Comencé a programar en Python (fue hace unos cuatro años), por lo ...

2  Tiempo de alta ejecución en el programa de partición numérico en Python 2.7  ( High execution time on number partitioning program in python 2 7 ) 
Estoy escribiendo un programa para contar solo las particiones de un número con distinta partes . Estoy usando un enfoque de abajo hacia arriba para la progr...

8  (Codewars kata) Memoised Log Cutting  ( Codewars kata memoised log cutting ) 
(No estoy seguro del nombre oficial de CS para el problema en cuestión, por lo que simplemente le di el nombre del kata). Problema Clear Cutter's necesi...

56  Solución de mochila de programación dinámica  ( Dynamic programming knapsack solution ) 
Escribí una solución a la problema de mochila en Python, utilizando un algoritmo de programación dinámico de abajo hacia arriba. Calcula correctamente el va...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos