• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>


            May the force be with you!
            posts - 52,  comments - 33,  trackbacks - 0
            //o(∩_∩)o...哈哈,我回來做題了……

            POJ1141是一個經典DP題,是一個“歷史遺留”問題了。
            一個簡單版本
            WOJ1077:Dragonflywww
            http://acm.whu.edu.cn/oak/problem/problem.jsp?problem_id=1077


            題目描述:
                 給出一個由(、)、[、]組成的字符串,添加最少的括號使得所有的括號匹配,輸出最后得到的字符串。

            解題思路:
                  用DP求最少需要括號數:以p從1到n(字符串長度),記錄下從i到i+p需要添加的最少括號數f[i][j],同時記錄下中間需要添加括號的位置pos[i][j]——為-1表示不需要添加。這種方法我原來就知道,所以過了WOJ1077。
                 最麻煩的就是添加括號構造字符串了,這里借鑒別人的方法用遞歸實現,程序里寫得很清楚了,要利用pos[i][j]。

              1 /*************************************************************************
              2 Author: littlekid
              3 Created Time: 1/9/2008 7:04:26 PM
              4 Problem Source: POJ1141
              5 Description: 
              6 ************************************************************************/
              7 # include <stdio.h>
              8 # include <string.h>
              9 # include <stdlib.h>
             10 
             11 # define N 222
             12 
             13 const int maxint=0x7FFFFFFF;
             14 typedef long long int64;
             15 const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
             16 
             17 int f[ N ][ N ], pos[ N ][ N ];
             18 char s[ N ];
             19 int n;
             20 
             21 inline int MIN( int a, int b )
             22 {
             23     return a > b ? b : a;
             24 }
             25 
             26 void init()
             27 {
             28     scanf( "%s"&s );
             29 }
             30 
             31 void output()
             32 {
             33     printf( "%d\n", f[ 1 ][ n ] );
             34     for ( int i = 1; i <= n; i ++ )
             35     {
             36         for ( int j = 1; j <= n; j ++ )
             37         {
             38             printf( "%c ", f[ i ][ j ] );
             39         }
             40         printf( "\n" ); 
             41     } 
             42 
             43 
             44 void recur(int beg, int end)
             45 {
             46     if( beg > end ) return ;
             47     
             48     if( beg == end )
             49     {
             50         if( s[ beg ] == '(' || s[ beg ] == ')' )
             51         {
             52             printf( "()" );
             53         } 
             54         else printf( "[]" );
             55     }
             56     else
             57     {
             58         if( pos[ beg ][ end ] == -1 )
             59         {
             60             if( s[ beg ] == '(' )
             61             {
             62                 printf( "(" );
             63                 recur( beg+1, end-1 );
             64                 printf( ")" );
             65             }
             66             else
             67             {
             68                 printf( "[" );
             69                 recur( beg+1, end-1 );
             70                 printf( "]" );
             71             }
             72         }
             73         else
             74         {
             75             recur( beg, pos[ beg ][ end ] );
             76             recur( pos[ beg ][ end ]+1, end );
             77         }
             78     }
             79 }
             80 
             81 int DP()
             82 {
             83     n = strlen( s );
             84     memset( f, 0, sizeof( f ));
             85     
             86     for ( int i = n; i > 0; i -- )
             87     {
             88         s[ i ] = s[ i-1 ];
             89         f[ i ][ i ] = 1;
             90     }
             91     
             92     int tmp;
             93     for ( int p = 1; p <= n; p ++ )
             94     {
             95         for ( int i = 1; i <= n-p; i ++ )
             96         {
             97             int j = i + p;
             98             f[ i ][ j ] = maxint;
             99             if ( ( s[ i ] == '(' && s[ j ] == ')' ) || ( s[ i ] == '[' && s[ j ] == ']' ) )
            100             {
            101                 tmp = f[ i+1 ][ j-1 ];
            102                 if ( tmp < f[ i ][ j ] )
            103                 {
            104                     f[ i ][ j ] = tmp;
            105                 }
            106             }
            107             pos[ i ][ j ] = -1;
            108             for ( int k = i; k < j; k ++ )
            109             {
            110                 tmp = f[ i ][ k ] + f[ k+1 ][ j ];
            111                 if ( tmp < f[ i ][ j ] )
            112                 {
            113                     f[ i ][ j ] = tmp;
            114                     pos[ i ][ j ] = k;
            115                 }
            116             }    
            117         }
            118     }
            119     return f[ 1 ][ n ];
            120 }
            121 
            122 int main()
            123 {
            124     //while ( scanf("%s", &s ) != EOF ){
            125     init();
            126     DP();
            127     //output();
            128     recur( 1, n );
            129     printf( "\n" );
            130     //}
            131     return 0;
            132 }
            133 
            134 

            posted on 2008-01-09 21:40 R2 閱讀(1315) 評論(0)  編輯 收藏 引用 所屬分類: Problem Solving
            你是第 free hit counter 位訪客




            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(4)

            隨筆分類(54)

            隨筆檔案(52)

            文章檔案(1)

            ACM/ICPC

            技術綜合

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 63696
            • 排名 - 358

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲性久久久影院| 国产精品久久久久国产A级| 久久精品无码一区二区app| 久久精品视屏| 伊人久久大香线蕉av不卡| 久久久精品免费国产四虎| 亚洲国产成人精品91久久久 | 久久久久成人精品无码中文字幕| 国内精品久久久久影院日本| 国产亚洲精久久久久久无码AV| 久久无码AV一区二区三区| 久久精品一区二区| 人妻精品久久无码区| 日本加勒比久久精品| 久久久久国产一级毛片高清版| 亚洲综合久久夜AV | 91精品观看91久久久久久| 亚洲国产精品无码久久久不卡| 精品久久国产一区二区三区香蕉| 久久影院综合精品| 伊人久久大香线蕉亚洲五月天| 久久免费视频6| 草草久久久无码国产专区| 久久人人爽人人爽人人AV东京热 | 伊人色综合久久天天| 久久婷婷国产剧情内射白浆 | 国产美女亚洲精品久久久综合| 久久伊人影视| 久久久久人妻精品一区三寸蜜桃| 久久亚洲国产欧洲精品一| 久久亚洲AV无码精品色午夜麻豆| 国产一久久香蕉国产线看观看| 久久综合九色综合欧美就去吻| 久久综合亚洲色HEZYO国产| 开心久久婷婷综合中文字幕| 久久久久久亚洲Av无码精品专口 | 97超级碰碰碰久久久久| 亚洲色大成网站WWW久久九九| 欧美久久久久久| 久久香综合精品久久伊人| 欧美久久久久久|