Card Рука Сортировка двоичного перечисления насилия

  В самом деле, из-за этой проблемы, то порядок расположения каждой масти только четыре цвета, но и просто 4! Виды, то внутренний каждый костюм в конце концов, по возрастанию или убыванию, по сути, может также прямое насилие, есть в общей сложности 4! * 2 ^ 4 случая, а затем непосредственно сортировать его, но как рассчитать позицию, которую вы хотите переместить его? ? ? Мы считаем это, мы из-за обеспечения внутреннего порядка, то он должен быть последним по возрастанию или убыванию, а затем вставить карту на самом деле достаточно изменить относительное положение внутри, рассмотреть беспорядочное, мы, конечно, найти самый длинный прирост подпоследовательности, то они не должны двигаться друг с другом, в то время как другие, безусловно, должны двигаться, потому что порядок до и после того, как они встретились, и они уверены, чтобы перейти непосредственно к двоичным перечислению.

#include <iostream> 
#include <stdio.h> 
#include < строка .h> 
#include <алгоритм>
 с помощью  пространства имен STD;
структура узла {
    INT идентификатор;
   INT вал;
   INT цв;
   ИНТ флаг;
} а [ 105 ];
INT дп [ 69 ];
INT Col [ 4 ] = { 0 , 1 , 2 , 3 };
символ с [ 105 ];
ИНТ п;
BOOL CMP (узел х, узел у) {
    если (x.col == y.col) {
       вернуть x.flag < y.flag;
   }
   возвращение цв [x.col] < цв [y.col];
}
Int LCS () {
    MemSet (дп, 0 , SizeOf (др));
    INT ANS = 1 ;
    для ( INT I = 1 ; г <= п; я ++ ) {
        дп [I] = 1 ;
        для ( INT J = 1 , J <я; j ++ ) {
             если (а [я] .id> а [J] .id) {
                дп [I] = макс (дп [I], дп [J] + 1 );
            }
        }
        лет = макс (лет дп [I]);
    }
    вернуться лет;
}
INT основных () {
   в то время как (~ зсапЕ ( " % d " , & п)) {
   INT ANS = 0x3f3f3f3f ;
  для ( INT I = 1 ; г <= п; я ++ ) {
     зсапЕ ( " % s " , s);
     если (с [ 0 ] == ' Т ' )
        а [я] .val = 10 ;
     остальное ,  если (с [ 0 ] == ' J ' )
        а [я] .val = 11 ;
     еще  если (с [ 0 ] == ' Q ' )
        а [я] .val = 12 ;
     остальное ,  если (с [ 0 ] == ' К ' )
        а [я] .val = 13 ;
     остальное ,  если (с [ 0 ] == ' ' )
        а [я] .val = 14 ;
     еще 
        а [я] .val = s [ 0 ] - ' 0 ' ;
     если (с [ 1 ] == ' s ' ) а [я] .col = 0 ;
     остальное ,  если (с [ 1 ] == ' ч ' ) а [я] .col = 1 ;
     остальное ,  если (с [ 1 ] == ' d ' ) а [я] .col = 2 ;
     еще а [я] .col = 3 ;
     а [я] .id = я;
  }
  // соиЬ << "SSSSSSS"; 
  делать {
     для ( INT I = 1 ; г < 16 ; я ++ ) {
         для ( Int J = 1 , J <= N; j ++ ) {
             а [J] .flag = а [J] .val * (((я >> Col [а [J] .col]) & 1 )? 1 : - 1 );
        }
        рода (а + 1 , а + 1 + п, CMP);
        INT Minn = n- ЛВП ();
        ANS = мин (АНС, штат Миннесота);
    }

  } В то время как (next_permutation (колонка, колонка + 4 ));
  Е ( " % d \ п " , ANS);
  }
  вернуться  0 ;
}

 

рекомендация

отwww.cnblogs.com/bluefly-hrbust/p/11628677.html