Я пытаюсь вычислить максимальную сумму, которая может быть достигнута при переходе от левого столбца в правый столбец в сетке. Разрешенные движения вверх, вниз, вправо. Я реализовал это решение (это поиск в ширине):Максимальная сумма пути от левого столбца до правого столбца
for(int i=1; i<=n; i++) {
Queue<Position> q = new LinkedList<Position>();
q.add(new Position(i, 1));
dp[i][1] = map[i][1];
while(!q.isEmpty()) {
Position node = q.poll();
visited[node.n][node.m] = 1;
if(dp[node.n][node.m] > max) {
max = dp[node.n][node.m];
}
if(visited[node.n-1][node.m] != 1 && node.n != 1 && dp[node.n-1][node.m] < dp[node.n][node.m] + map[node.n-1][node.m] && map[node.n-1][node.m] != -1) {
dp[node.n-1][node.m] = dp[node.n][node.m] + map[node.n-1][node.m];
q.add(new Position(node.n-1, node.m));
}
if(visited[node.n+1][node.m] != 1 && node.n != n && dp[node.n +1][node.m] < dp[node.n][node.m] + map[node.n+1][node.m] && map[node.n+1][node.m] != -1) {
dp[node.n +1][node.m] = dp[node.n][node.m] + map[node.n+1][node.m];
q.add(new Position(node.n + 1, node.m));
}
if(visited[node.n][node.m+1] != 1 && node.m != m && dp[node.n][node.m+1] < dp[node.n][node.m] + map[node.n][node.m+1] && map[node.n][node.m+1] != -1) {
dp[node.n][node.m+1] = dp[node.n][node.m] + map[node.n][node.m+1];
q.add(new Position(node.n, node.m+1));
}
}
}
static class Position {
int n, m;
public Position(int row, int column) {
this.n = row;
this.m = column;
}
}
Пример ввод:
-1 4 5 1
2 -1 2 4
3 3 -1 3
4 2 1 2
Проблема с моим решением он должен достичь 2 (в последнем ряде 2-й колонке), следуя- -> 3-> 3-> 2, но мое решение поместило 2 в состояние посещения, чтобы оно не проверял. И если я удаляю посещенный массив, он попадает в бесконечный цикл вверх, вниз, вверх, вниз по любой ячейке.
Редактировать: Каждый пункт можно посетить только один раз.
'4-> 3-> 3-> 2' не доходит до последней колонки. Можете ли вы прояснить проблему, пожалуйста? – IVlad
Родственные: http://stackoverflow.com/q/32679720/572670 Похоже, что у вас разные ходы. – amit
2 на позиции (4,2) можно достичь с помощью 4-> 2, а также 4-> 3-> 3-> 2, но я хочу один с максимальными точками, чтобы он мог туда попасть вторым вариантом. Проблема заключается в том, что после достижения 4-> 2 он устанавливает 2, как уже было посещено, поэтому 4-> 3-> 3 не будет рассматривать 2 для следующей позиции – crysis