Solución del problema OJ de la Universidad de Tecnología de Xiamen (1643: Chequeadores divertidos)

Descripción

La hermana mayor Tuyali diseñó un juego de damas para su hermana menor, que acaba de ir al jardín de infantes. Se sabe que hay una fila de cuadrículas en el tablero, y cada cuadrícula tiene un número entero no negativo, que representa la longitud máxima que se puede saltar. fuera de esta cuadrícula. El juego requiere el menor número de saltos para llegar a la última cuadrícula final. Querido tú, ¿quieres divertirte también?

Aporte

Ingrese un número entero N en la primera línea, lo que significa el número de cuadrículas, 2 <= N <= 1000, y la
segunda línea es N números enteros no negativos, con espacios entre ellos, lo que indica la longitud máxima de cada cuadrícula que puede saltar fuera más tarde

Producción

Un número entero que representa el número mínimo de saltos requeridos; si no se puede alcanzar la cuadrícula final, salida -1

Entrada de muestra

Muestra: 1
5
2 1 0 5 6
Muestra: 2
8
2 5 1 1 4 1 3 6
Salida de muestra

Ejemplo 1
-1
Ejemplo 2
3
Sugerencia

Ejemplo 1: ¿Cómo no puedo saltar al último cuadro?
Ejemplo 2: Puedes saltar así: 2 -> 5 5 -> 3 3 -> 6

Manteniendo una matriz dp, dp [i] representa el número mínimo de pasos requeridos para alcanzar el i-ésimo punto, que es inicialmente infinito, excepto para dp [0] que es 0 (porque está en 0 al principio, el número de pasos para llegar a 0 es 0).
No es difícil obtener la ecuación de transición de estado: dp [i + j] = min (dp [i] + 1, dp [i + j]) (0 <i <n, 1 <= j <= maxsteps [i ]), maxsteps [i] es la longitud máxima de la cuadrícula que puedo saltar.
Es decir, para cada punto b se puede llegar por cualquier punto de un paso (es decir, saltar b-a cuadrícula), donde a <b, b-a <= maxsteps [a], elija dp [a] de cualquier punto a Suma 1 (un paso) al punto más pequeño como el valor de dp [b]. Cuando finalmente llegamos al punto n-1, dp [n-1] es el número mínimo de pasos que requerimos.

#include <iostream>
#include <vector>

using namespace std;

const int inf = 1001;

int main(void)
{
    
    
	int n;
	cin >> n;

	vector<int> dp(n, inf); dp[0] = 0;

	for (int i = 0; i < n; ++i)
	{
    
    
		int v;
		cin >> v;

		for (int j = 1; j <= v && i + j < n; ++j)
		{
    
    
			dp[i + j] = min(dp[i] + 1, dp[i + j]);
		}
	}

	cout << (dp[n - 1] == inf ? -1 : dp[n - 1]) << endl;

	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_42988445/article/details/115281230
Recomendado
Clasificación