Как изменить массив переменной типа java long на класс java BigInteger для поддержки очень больших выходных данных?

#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