/ * Для двух последовательностей скобок, строки с законным кронштейном для покрытия двух строк, определить , самую короткую строку проблема может быть разложена на два условие: 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 (); } Ставит ( "" ); }
cf1272F-- классическая роза одномерная дп, хороший вопрос!
рекомендация
отwww.cnblogs.com/zsben991126/p/12113735.html
рекомендация
ранжирование