В самом деле, из-за этой проблемы, то порядок расположения каждой масти только четыре цвета, но и просто 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 ; }