[HDU 1208] Viajes de Pascal (Programación dinámica DP)

## Límite de tiempo de los viajes de Pascal
: 1000MS Límite de memoria: 32768KB Formato de E / S de 64 bits:% I64d &% I64u
## Descripción
Un tablero de juego nxn se llena con números enteros, un número entero no negativo por cuadrado. El objetivo es viajar por cualquier camino legítimo desde la esquina superior izquierda hasta la esquina inferior derecha del tablero. El número entero en cualquier cuadrado dicta qué tan grande debe ser un paso desde esa ubicación. Si el tamaño del paso avanzara fuera del tablero de juego, entonces está prohibido dar un paso en esa dirección en particular. Todos los pasos deben estar a la derecha o hacia abajo. Tenga en cuenta que un 0 es un callejón sin salida que evita cualquier progreso adicional.

Considere el tablero de 4 x 4 que se muestra en la Figura 1, donde el círculo sólido identifica la posición inicial y el círculo punteado identifica el objetivo. La Figura 2 muestra los tres caminos desde el inicio hasta el objetivo, con los números irrelevantes en cada uno eliminado.
Escriba la descripción de la imagen aquí

## Entrada
La entrada contiene datos de una a treinta placas, seguida de una línea final que contiene solo el número entero -1. Los datos de un tablero comienzan con una línea que contiene un único entero positivo n, 4 <= n <= 34, que es el número de filas en este tablero. A esto le siguen n filas de datos. Cada fila contiene n dígitos únicos, 0-9, sin espacios entre ellos.

## Salida
La salida consta de una línea para cada placa, que contiene un solo entero, que es el número de rutas desde la esquina superior izquierda a la esquina inferior derecha. Habrá menos de 2 ^ 63 rutas para cualquier tablero.

## Entrada de muestra
4
2331
1213
1231
3110
4
3332
1213
1232
2120
5
11101
01111
11111
11101
11101
-1

## Salida de muestra
3
0
7
Sugerencia
Sugerencia Los métodos de fuerza bruta que examinan cada ruta probablemente excederán el límite de tiempo asignado.
Los valores enteros de 64 bits están disponibles como valores “__int64” usando Visual C / C ++ o valores “long long”
usando GNU C / C ++ o valores “int64” usando compiladores Free Pascal.

##### PD: La llamada programación dinámica significa que debes tomar una decisión en cada etapa. El conjunto de decisiones desde el principio hasta el final se denomina estrategia, y la diversidad de decisiones en cada etapa conduce directamente a la variedad de estrategias. Y generalmente buscamos la estrategia óptima o la estrategia de costo máximo de llamadas. La decisión de cada etapa está relacionada con la decisión de la etapa anterior bajo este efecto intencional. Usamos algo que registra esta etapa (generalmente una matriz dinámica) para registrar el estado de las decisiones de política que satisfacen nuestras necesidades.

El proceso dinámico de esta pregunta es almacenar el número de métodos en el punto (i, j) en dp [i] [j], y lo recorremos desde el principio hasta el final (en el caso de no cruzar el límite y actualmente hay es una estrategia para pasar al siguiente estado).

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 35;

char str[maxn];
long long map[maxn][maxn];
long long dp[maxn][maxn];
int n;

int main(){
	while( ~scanf("%d",&n) ){
		if(n==-1) break;
		for( int i=0 ; i<n ; i++){
			scanf("%s",str);
			for( int j=0 ; j<n ; j++ ){
				map[i][j] = str[j]-'0';
			}
		}
		memset(dp,0,sizeof(dp));


		dp[0][0] = 1;
		for( int i=0 ; i<n ; i++ ){
			for( int j=0 ; j<n ; j++ ){
				if(!map[i][j]) continue;
				if(i+map[i][j]<n){
					dp[i+map[i][j]][j] += dp[i][j];
				}
				if(j+map[i][j]<n){
					dp[i][j+map[i][j]] += dp[i][j];
				}
			}
		}
		printf("%lld\n",dp[n-1][n-1]);
	}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/thesprit/article/details/52046568
Recomendado
Clasificación