Оптимизация кода для подсчета перестановок, начинающихся с x, определяемых последовательностью DI - PullRequest
0 голосов
/ 16 июня 2019

Я хочу посчитать все перестановки, которые находятся в определенном подмножестве, определенном DI Sequence и соответствующим заданным начальным значениям.

Аналогичная проблема: https://leetcode.com/articles/valid-permutations-for-di-sequence/

пример длины перестановки 4:

У нас есть входная длина цепочки битов 3 (всегда длина перестановки - 1)

010

0 означает 2 последовательных элементов I ncreasing.

1 означает 2 последовательных элементов D смазывающихся.

Для этой цепочки битов существует подмножество со следующими перестановками: 1324,1423,2314,2413,3412

Теперь я хочу посчитать все перестановки с начальными значениями 1,2

Поэтому у меня есть этот вызов метода: numsInDISequence(bitset, new int[]{1,1,0,0},4)

Метод:

public int numsInDISequence(BitSet bits,  int[] start, int len){
    int[] dp =  Arrays.copyOf(start,start.length);
    int[] dp2 = new int[len-1];

    for(int i=0;i<len-1;i++){
        if(!bits.get(i)){
            for(int j=0; j<dp.length;j++){
                for(int k=j;k<dp2.length;k++) {
                   dp2[k]+=dp[j];
                }
             }
        }else{
             for(int j=0;j<dp.length;j++){
                for(int k=0;k<j;k++){
                    dp2[k]+=dp[j];
                 }
             }
         }
         dp = Arrays.copyOf(dp2,dp2.length);
         dp2 = new int[dp.length-1];
     }
     return dp[0];
}

Этот алгоритм работает с O(len^3) Можно ли улучшить сложность до O(len^2) или лучше? Если да, то как?

1 Ответ

0 голосов
/ 17 июня 2019

Я нашел решение сделать это в пределах O(len^2) сложности. Просто возьмите решение O(N^2) из связанной аналогичной проблемы и используйте массив start в качестве исходного dp массива.

аналогичная проблема

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...