pregunta:
Un robot está ubicado en la esquina superior izquierda de una cuadrícula de mx n (el punto de inicio está marcado como "Inicio" en la imagen a continuación).
El robot sólo puede moverse un paso hacia abajo o hacia la derecha a la vez. El robot intenta llegar a la esquina inferior derecha de la cuadrícula (etiquetada como "Finalizar" en la imagen a continuación).
¿Cuántos caminos diferentes hay en total?
Ideas y algoritmos
Usamos f(i, j)f(i,j) para representar el número de caminos desde la esquina superior izquierda hasta (i, j)(i,j), donde los rangos de ii y jj son [0, m) [0,m) y [0,n)[0,n).
Como solo podemos movernos un paso desde abajo o hacia la derecha en cada paso, si queremos ir a (i, j)(i,j), si bajamos un paso, pasaremos de (i-1, j)(i− 1,j) pasa; si das un paso hacia la derecha, pasarás de (i, j-1)(i,j−1). Por tanto podemos escribir la ecuación de transferencia de programación dinámica:
f(i, j) = f(i-1, j) + f(i, j-1)
f(i,j)=f(i−1 ,j)+f(i,j−1)
Cabe señalar que si i=0i=0, entonces f(i-1,j)f(i−1,j) no es un estado que cumpla los requisitos y debemos ignorar este término; de manera similar, si j = 0j=0, entonces f(i,j-1)f(i,j−1) no es un estado que cumpla con los requisitos y debemos ignorar este elemento.
La condición inicial es f (0,0) = 1f (0,0) = 1, es decir, hay una manera de caminar desde la esquina superior izquierda hasta la esquina superior izquierda.
La respuesta final es f(m-1,n-1)f(m−1,n−1).
código de lenguaje c
int rutas únicas(int m, int n) { int f[m][n]; for (int i = 0; i < m; ++i) { f[i][0] = 1; } para (int j = 0; j < n; ++j) { f[0][j] = 1; } para (int i = 1; i < m; ++yo) { for (int j = 1; j < n; ++j) { f[i][j] = f[i - 1][j] + f[i][j - 1]; } } return f[m - 1][n - 1]; }