Seja F (i, j) o maior número de moedas que o robô pode coletar e trazer para a célula (i, j) na i-ésima linha e j-ésima coluna do tabuleiro. Ele pode chegar a essa célula a partir da célula adjacente (i - 1, j) acima dela ou da célula adjacente (i, j - 1) à esquerda dela. O maior número de moedas que podem ser trazidas para essas células são F (i - 1, j) e F (i, j - 1), respectivamente. Obviamente, não há células adjacentes acima das células da primeira linha e não há células adjacentes à esquerda das células da primeira coluna. Para essas células, assumimos que F (i - 1, j) e F (i, j - 1) são iguais a 0 para seus vizinhos inexistentes. Portanto, o maior número de moedas que o robô pode trazer para a célula (i, j) é o máximo desses dois números mais uma moeda possível na própria célula (i, j). Em outras palavras, temos a seguinte fórmula para F (i, j):
F (i, j) = max {F (i - 1, j), F (i, j - 1)} + cij para 1≤ i ≤ n, 1≤ j ≤ m
F (0, j) = 0 para 1≤ j ≤ m e F (i, 0) = 0 para 1≤ i ≤ n,
onde cij = 1 se houver uma moeda na célula (i, j) e cij = 0 caso contrário.
Usando essas fórmulas, podemos preencher a tabela n × m de valores F (i, j) linha por linha ou coluna por coluna, como é típico para algoritmos de programação dinâmica envolvendo tabelas bidimensionais.