Я внедрил три версии проблемы с минимальной затратой (рекурсивный, сверху вниз DP и снизу вверх DP). Я подозреваю, что в моей реализации нисходящего вниз могут быть ошибки, особенно вокруг целочисленного переполнения и проверки меморизации, но она дает правильные ответы даже при экстремальных тестовых случаях. реализация < /h3>
public static int topDown(int[][] maze){
int M = maze.length;
int N = maze[0].length;
int[][] dp = new int[M][N];
return helper(maze,0,0,dp);
}
public static int helper(int[][] maze,int i,int j,int[][] dp){
topDown++;
int M = maze.length;
int N = maze[0].length;
if(i > M - 1 ) return Integer.MAX_VALUE-maze[i-1][j];
if(j > N - 1) return Integer.MAX_VALUE-maze[j-1];
if(i == M - 1 && j == N - 1) return maze[j];
if(dp[j] != 0) return dp[j];
dp[j] = Math.min(
maze[j] + helper(maze,i+1,j,dp),
maze[j] + helper(maze,i,j+1,dp)
);
return dp[j];
}
< /code>
тестовый пример с большими значениями < /h3>
int[][] maze = {
{1, -5},
{2, 3}
};
< /code>
Ожидаемое поведение: расчет (integer.max_value -(-5) ... должно вызвать переполнение целочисленного. /> Существуют ли тестовые случаи, когда эта реализация не удалась? /> Протестировано со значениями вблизи integer.max_value: кажется, работает < /li>
Прослеживается через рекурсию вручную < /li>
< /ul>
Подробнее здесь: https://stackoverflow.com/questions/797 ... ll-correct
Целое число переполнений в динамическом программировании - почему ответ все еще правильный? [закрыто] ⇐ JAVA
Программисты JAVA общаются здесь
1759745705
Anonymous
Я внедрил три версии проблемы с минимальной затратой (рекурсивный, сверху вниз DP и снизу вверх DP). Я подозреваю, что в моей реализации нисходящего вниз могут быть ошибки, особенно вокруг целочисленного переполнения и проверки меморизации, но она дает правильные ответы даже при экстремальных тестовых случаях. реализация < /h3>
public static int topDown(int[][] maze){
int M = maze.length;
int N = maze[0].length;
int[][] dp = new int[M][N];
return helper(maze,0,0,dp);
}
public static int helper(int[][] maze,int i,int j,int[][] dp){
topDown++;
int M = maze.length;
int N = maze[0].length;
if(i > M - 1 ) return Integer.MAX_VALUE-maze[i-1][j];
if(j > N - 1) return Integer.MAX_VALUE-maze[i][j-1];
if(i == M - 1 && j == N - 1) return maze[i][j];
if(dp[i][j] != 0) return dp[i][j];
dp[i][j] = Math.min(
maze[i][j] + helper(maze,i+1,j,dp),
maze[i][j] + helper(maze,i,j+1,dp)
);
return dp[i][j];
}
< /code>
тестовый пример с большими значениями < /h3>
int[][] maze = {
{1, -5},
{2, 3}
};
< /code>
Ожидаемое поведение: расчет (integer.max_value -(-5) ... должно вызвать переполнение целочисленного. /> Существуют ли тестовые случаи, когда эта реализация не удалась? /> Протестировано со значениями вблизи integer.max_value: кажется, работает < /li>
Прослеживается через рекурсию вручную < /li>
< /ul>
Подробнее здесь: [url]https://stackoverflow.com/questions/79783282/integer-overflow-in-dynamic-programming-why-is-the-answer-still-correct[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия