Максимизация прибыли на основе программирования dynamix

#dynamic-programming

#динамическое программирование

Вопрос:

Я пытался решить эту проблему: » Вы должны путешествовать по разным деревням, чтобы получить какую-то прибыль. В каждой деревне вы получаете некоторую прибыль. Но загвоздка в том, что из конкретной деревни i вы можете перейти в деревню j только тогда и только тогда, когда прибыль от деревни j кратна прибыли от деревни i.

Вы должны указать максимальную прибыль, которую вы можете получить во время путешествия. «

Вот ссылка на полную проблему: https://www.hackerearth.com/practice/algorithms/dynamic-programming/introduction-to-dynamic-programming-1/practice-problems/algorithm/avatar-and-his-quest-d939b13f/description/

Я пытался решить эту проблему в течение нескольких часов. Я знаю, что это вариант самой длинной возрастающей подпоследовательности, но первая мысль, которая пришла мне в голову, заключалась в том, чтобы решить ее с помощью рекурсии, а затем запомнить ее. Вот часть кода моего подхода. Пожалуйста, помогите мне определить ошибку.

     static int[] dp;
    static int index;
    static int solve(int[] p) {
        int n = p.length;
        int max = 0;
        for(int i = 0;i<n; i  )
        {
            dp = new int[i 1];
            Arrays.fill(dp,-1);
            index = i;
            max = Math.max(max,profit(p,i));
        }
        return max;
    }
    static int profit(int[] p, int n)
    {
        if(dp[n] == -1)
        {
            if(n == 0)
            {
                if(p[index] % p[n] == 0)
                    dp[n] = p[n];
                else
                    dp[n] = 0;
            }
            else
            {
                int v1 = profit(p,n-1);
                int v2 = 0;
                if(p[index] % p[n] == 0)
                    v2 = p[n]   profit(p,n-1);
                dp[n] = Math.max(v1,v2);
            }
        }
        return dp[n];
    }
  

Ответ №1:

Я использовал дополнительный массив для получения решения, мой код написан на Java.

 public static int getmaxprofit(int[] p, int n){
       // p is the array that contains all the village profits 
       // n is the number of villages
       // used one extra array msis, that would be just a copy of p initially
       int i,j,max=0;
       int msis[] = new int[n];

       for(i=0;i<n;i  ){
           msis[i]=p[i];
       }
       // while iteraring through p, I will check in backward and find all the villages that can be added based on criteria such previous element must be smaller and current element is multiple of previous.

       for(i=1;i<n;i  ){
           for(j=0;j<i;j  ){
               if(p[i]>p[j] amp;amp; p[i]%p[j]==0 amp;amp; msis[i] < msis[j] p[i]){
                   msis[i] = msis[j] p[i];
               }
           }
       }
       for(i=0;i<n;i  ){
           if(max < msis[i]){
               max = msis[i];
           }
       }
       return max;
    }