cf1272F-- классическая роза одномерная дп, хороший вопрос!

/ * 
Для двух последовательностей скобок, строки с законным кронштейном для покрытия двух строк, определить , самую короткую строку 
проблема может быть разложена на два условие: 
    1. кратчайшей последовательности в квадратных скобках , чтобы покрыть две строки 
    2 эта последовательность будет юридически 
рассматриваться в первую очередь первое условие: 
    трудно думать о двух состояния дп [I, J] , выраженную матче с [1..i], т наименьшей длины [1..j] , когда 
     передача очень просто: начальное состояние дп [0,0] = 0, то обратно плюс «(», за ростом «»): все они были доставлены в состояние обновления , соответствующий   
    конечный результат дп [линза, одолжила] , 

а затем снова рассмотрит условие на втором 
    кронштейне последовательность правомерный при условии , что все префиксы и> = 0, а последние и 0 (знают , что я имею в виду) , 
    чтобы сделать последний поезд , чтобы выполнить это условие, мы должны принять во внимание префикса и состояние на момент передачи, состояние> = 0 , 
    естественно , думать о размерности л дп, дп [I, J, K] указывает на совпадение , чтобы быть с [1..i], т [1..j ] и самый короткий префикс длины к и 
    начальное состояние дп [0,0 , 0] = 0, передача выше 
    этот префикс и диапазон должен в [0, объектив + одолжил], так что сложность всей дп является O (N ^ 3) 
окончательный ответ: 
    йр [I, J, K] + K где найти наименьшее записывается как мин K 
за счет выхода раствора, таким образом , мы можем записать предшественник (это мелочь достигнута) 
* / 
#include <бит / STDC ++. H>
 А с использованием  пространство именстанд;
#define N 1005 Чара S [N], т [Н];
INT дп [ 205 ] [ 205 ] [ 405 ], объектив, одолжил; 
структура узла {
     INT I, J, K, флаг, Len; 
    Узел () {} 
    Узел ( INT я, INT J, INT к, INT флаг, INT LEN): I (I), J (к), к (к), флаг (флаг), длина (длина) {} 
} предварительно [ 205 ] [ 205 ] [ 405 ]; 
Стек < символ > СТК;
недействительные печати (узел Узел) {
     если


(node.flag == - 1 ) stk.push ( ' ) ' );
    остальное ,  если (node.flag == 1 ) stk.push ( ' ( ' );
     если (node.len) 
        печати (предварительно [node.i] [node.j] [node.k]); 
} 

INT основных () { 
    зсапЕ ( " % s% s " , s + 1 , T + 1 ); 
    линзы = STRLEN (s + 1 ); одолжил = STRLEN (т + 1 ); 
    
    MemSet (дп, 0x3f , SizeOf др); 
    дп [ 0 ] [ 0] [ 0 ] = 0 ; 
    
    для ( Int I = 0 ; я <= линзы; я ++ )
         для ( INT J = 0 ; J <= одолжил; j ++ )
             для ( INT к = 0 ; к <= объектив + одолжил; K ++ ) {
                 если (дп [я ] [J] [K] == 0x3f3f3f3f ) продолжить ;
                если (к) { // 加个右括号
                    INT f1, f2;
                    если (с [г + 1 ] == ' ) ' ) f1 = 1;
                    остальное f1 = 0 ;
                    если (т [J + 1 ] == ' ) ' ) 2 = 1 ;
                    еще 2 = 0 ;
                    если (дп [I] [J] [K] + 1 <дп [я + F1] [J + F2] [к- 1 ]) { // 更新状态 
                        Узел Узел Узел = (I, J, K, - 1 дп, [I] [J] [K]); 
                        предварительно [я + F1] [J + F2] [к- 1 ] = узел; 
                        дп [я + F1] [J + F2] [к- 1 ] = дп [I] [J] [K] +1 ;                  
                    } 
                } 
                // добавить левый кронштейн 
                Int F1, F2;
                 ЕСЛИ (S [I + 1 ] == ' ( ' ) F1 = 1 ;
                 остальное F1 = 0 ;
                 ЕСЛИ (Т [J + 1 ] == ' ( ' ) = F2 , 1. ;
                 остальное F2 = 0 ;
                 ЕСЛИ (ДП [I] , [J] , [К] + . 1 <DP [I + F1] [F2 + J , ] [К + . 1 ]) { // обновление состояния
                    Узел Узел = Узел (I, J, K, 1 , дп [I] [J] [K]); 
                    предварительно [я + F1] [J + F2] [K + 1 ] = узел; 
                    дп [я + F1] [J + F2] [к + 1 ] = дп [I] [J] [K] + 1 ;                 
                } 
            } 
    
    INT Мин = 0x3f3f3f3f , норка = 0 ;
    для ( INT к = 1 ; к <= объектив + одолжил; K ++ ) {
         если (дп [линзы] [одолжил] [к] + к <дп [линзы] [одолжил] [норка] + норка) { 
            норка = к; 
        } 
    }
    
    для ( Int I = 1 ; я <= норка; я ++) stk.push ( ' ) ' );    
    печать (предварительно [линзы] [одолжил] [норка]); 
    в то время как (stk.size ()) { 
        соиЬ << stk.top (); 
        stk.pop (); 
    } 
    Ставит ( "" ); 
}

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

отwww.cnblogs.com/zsben991126/p/12113735.html