#java #arrays #recursion #dynamic-programming #biginteger
Вопрос:
Я пытаюсь обновить программу Java для поддержки очень больших выходных данных. В настоящее время программа поддерживает данные длинного типа, я пытаюсь изменить тип long на класс BigInteger.
Вот оригинальная программа,
class WaysDP_long
{
static int A = 3;
static int B = 2;
static int C = 2;
static long CountWays(int a, int b, int c, long [][][]dp)
{
if (a > A || c >= C) return 0L;
if (b >= B) return 1L;
if (dp[a][b][c] != -1) return dp[a][b][c];
long ways = 0;
ways = CountWays(a 1, b, c 1, dp);
ways = CountWays(a 1, b 1, c, dp);
ways = CountWays(a 1, b 2, c, dp);
ways = CountWays(a 1, b 4, c, dp);
// Memorize and return
return dp[a][b][c] = ways;
}
// Driver code
public static void main(String[] args)
{
long[][][] dp = new long[A 1][B 5][C];
for(int i = 0; i < A 1; i )
for(int j = 0; j < B 5; j )
for(int k = 0; k < C; k ) dp[i][j][k]=-1L;
System.out.println(CountWays(0, 0, 0, dp));
}
}
Чтобы поддерживать большие значения для A, B и C, я пытался преобразовать некоторые переменные в BigInteger,
вот мой обновленный код,
class WaysDP_Large
{
static int A = 3;
static int B = 2;
static int C = 2;
static boolean[][][] supportDP = new boolean[B 1][A 5][C]; // to avoid BigInteger negative initialization.
static BigInteger CountWays(int a, int b, int c, BigInteger [][][]dp)
{
if (a > B || c >= C) return BigInteger.ZERO;
if (b >= A) return BigInteger.ONE;
if (supportDP[a][b][c]) return dp[a][b][c];
BigInteger ways = BigInteger.ZERO;
ways.add(CountWays(a 1, b, c 1, dp));
ways.add(CountWays(a 1, b 1, c, dp));
ways.add(CountWays(a 1, b 2, c, dp));
ways.add(CountWays(a 1, b 4, c, dp));
// Memorize and return
supportDP[a][b][c] = true;
//dp[ballsPlayed][currentScore][wicketsGone] = new BigInteger();
return dp[a][b][c] = ways;
}
// Driver code
public static void main(String[] args)
{
BigInteger[][][] dp = new BigInteger[B 1][A 5][C];
for(int i = 0; i < B 1; i )
for(int j = 0; j < A 5; j )
for(int k = 0; k < C; k ) supportDP[i][j][k] = false;
// for(int i = 0; i < balls 1; i )
// for(int j = 0; j < target 5; j )
// for(int k = 0; k < wickets; k ) dp[i][j][k] = BigInteger.ZERO;
System.out.println(CountWays(0, 0, 0, dp));
}
}
Но обновленный код всегда выдает 0, он должен давать 13. [для 3, 4, 3 это будет 20]
Вероятно, проблема с назначением и добавлением BigInteger. Любые подсказки по преодолению проблемы будут оценены по достоинству. Спасибо.
Комментарии:
1. Вы изменили
ways = CountWays(a 1, b, c 1, dp);
наways.add(CountWays(a 1, b, c 1, dp));
«Они не делают то же самое», чтоBigInteger
и неизменное.2. Для достижения этой цели «пути = количество путей(a 1, b, c 1, dp)» какие изменения мне нужны, пожалуйста, @tgdavies
3.
ways = ways.add(CountWays(a 1, b, c 1, dp))
4. Это работает. Большое спасибо. @tgdavies