diferentes caminos

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];     }













Supongo que te gusta

Origin blog.csdn.net/weixin_52734253/article/details/125309488
Recomendado
Clasificación