• <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>

            ACM PKU 1411 Brackets Sequence 動態(tài)規(guī)劃

            http://acm.pku.edu.cn/JudgeOnline/problem?id=1141

            根據(jù)劉汝佳的推薦,這道題是“簡單”的動態(tài)規(guī)劃,卻用了我兩個多小時的時間……
            還是不熟悉啊 ,呵呵 時間主要浪費在第一個思路上。

            兩個思路;

            思路一:
            int num[i][j]表示第i個字符到第j個字符需要添加的最少字符數(shù)。string after[i][j]表示操作后,第i個字符到第j個字符按照最優(yōu)方案添加括號后的串。
            輸出after[0][len-1]
            #include"stdio.h"
            #include
            "string.h"

            char *after[100][100];
            int  num[100][100];
            char *str=new char[100];
            int len;


            char * str_bin(char* str1, char* str2) //合并字符串的函數(shù) 

            int n = strlen(str1)+strlen(str2); 
            char* str = new char[n+1]; 
            int i = 0
            while ( *str1 && *str2) 

            if (*str1 < *str2) 
            str[i
            ++= *str1++
            else 
            str[i
            ++= *str2++
            }
             

            if (*str1) 
            while (str[i++= *str1++); 
            else 
            while (str[i++= *str2++); 

            return str; 
            }
             

            void dp()
            {
                
            int i,j,k,z;
                
            for(i=len-1;i>=0;i--)
                  
            for(j=i;j<=len-1;j++)
                    
            {
                      num[i][j]
            =32767;
                      after[i][j]
            =new char[100];
                      after[i][j]
            ="";
                  }
                                        //初始化

                 
                
            for(i=len-1;i>=0;i--)
                  
            for(j=i;j<=len-1;j++)
                  
            {
                   
            if(i==j)
                   
            {
                       num[i][j]
            =1;
                       
            if(str[i]=='(') after[i][j]="()";
                       
            if(str[i]==')') after[i][j]="()";
                       
            if(str[i]=='[') after[i][j]="[]";
                       
            if(str[i]==']') after[i][j]="[]";
                   }

                   
            else
                   
            {
                      
                           
            if(str[i]=='('&&str[j]==')')          
                             
            if(num[i+1][j-1]<num[i][j])
                             
            {
                              num[i][j]
            =num[i+1][j-1];
                              after[i][j]
            ='('+after[i+1][j-1]+')';
                             }

                             
            else if(str[i]=='['&&str[j]==']')          
                             
            if(num[i+1][j-1]<num[i][j])
                             
            {
                              num[i][j]
            =num[i+1][j-1];
                              after[i][j]
            ='['+after[i+1][j-1]+']';
                             }
                          
                       
                          
            for(k=i;k<j;k++)
                              
            if(num[i][k]+num[k+1][j]<num[i][j])
                      
            //     if(strlen(after[i][j])>strlen(after[i][k])+strlen(after[k+1][j]) )
                           {
                               num[i][j]
            =num[i][k]+num[k+1][j];
                               after[i][j]
            =str_bin(after[i][k],after[k+1][j]);
                
                           }


                   }


                  }


                


            }


            void main()
            {
                
            while (scanf("%s", str) != EOF)
                
            {
                len
            =strlen(str);
                dp();
                printf(
            "%s\n",after[0][len-1]);
                }


            }

            總是WA,連Sample Input里的數(shù)據(jù)都通不過。而且我char *after[][]是三維數(shù)組,太不方便了,代碼看起來很亂,很不爽。
            想起學(xué)C語言時候,判斷括號匹配時用的是遞歸。那能不能在查找匹配時也用遞歸呢? 于是有了思路二。
                 

            思路二:
                int opt[i,j]表示第i個字符到第j個字符需要添加的最少字符數(shù),狀態(tài)轉(zhuǎn)移方程: a[i,j]=min(a[i,k]+a[k+1,j]) 
                
            #include "string.h"
            #include 
            "stdio.h"
            char str[128];
            int opt[110][110],tag[110][110]; //tag記錄能否str[st]和str[end]中劃分子問題,用opt[i][j]表示從str[st]到str[end]所需要插入的最小字符數(shù)

            void search(int st,int end)
            {
             
            if(st>end) return;
             
            else if(st==end){         //如果剩下最后一個字符,為之配對
              if(str[st]=='('||str[st]==')')
               printf(
            "()");
              
            else printf("[]");
             }

               
            else{
                   
            if(tag[st][end]==-1){  //如果str[st]和str[end]配對(tag==-1),打印str[st]和str[end],繼續(xù)搜索str[st+1]和str[end-1]
               if(str[st]=='('){
                printf(
            "(");
                search(st
            +1,end-1);
                printf(
            ")");
               }
            else{
                printf(
            "[");
                search(st
            +1,end-1);
                printf(
            "]");
               }

              }

                   
            else{                //如果str[st]和str[end]不配對(tag!=-1),搜索從tag分開的兩個子問題
               search(st,tag[st][end]);
               search(tag[st][end]
            +1,end);
              }

             }

            }



            void main()
            {
             
            int len,i,interval,j,k,s,tmp;
             
            while(scanf("%s",str)!=EOF)
             
            {
              len
            =strlen(str);
              
            for(i=0;i<len;i++)opt[i][i]=1;                            //初始化,
              for(interval=1;interval<len;interval++)                   //從間隔1個字母到間隔len-1個字母分別計算tag
               for(i=0;i+interval<len;i++
               
            {
                j
            =i+interval;
                tmp
            =32767;
                
            if(str[i]=='('&&str[j]==')'||str[i]=='['&&str[j]==']')  //如果str[i]和str[j]可以配對,問題轉(zhuǎn)化為求str[i+1][j-1]的tag
                 tmp=opt[i+1][j-1];
                tag[i][j]
            =-1;
                
            for(k=i;k<j;k++)
                
            {
                 
            if(tmp>opt[i][k]+opt[k+1][j])
                 
            {
                     tmp
            =opt[i][k]+opt[k+1][j];
                     tag[i][j]
            =k;
                 }

                opt[i][j]
            =tmp;
                }

               }

              search(
            0,len-1);
              printf(
            "\n");
             }

             
            return;
            }

            posted on 2007-09-18 03:02 流牛ζ木馬 閱讀(1311) 評論(2)  編輯 收藏 引用

            評論

            # re: ACM PKU 1411 Brackets Sequence 動態(tài)規(guī)劃 2007-11-24 13:40 大隱于市

            汗,老大的題號寫錯了吧。。。這題是1141,而不是1411。。  回復(fù)  更多評論   

            # re: ACM PKU 1411 Brackets Sequence 動態(tài)規(guī)劃 2009-09-17 23:33 solofancy

            第二個WA吧  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2007年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            導(dǎo)航

            統(tǒng)計

            公告

            MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木馬

            常用鏈接

            留言簿(6)

            隨筆檔案

            相冊

            搜索

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲AV日韩精品久久久久久久| 人人狠狠综合久久亚洲88| 久久久久99这里有精品10| 亚洲中文字幕久久精品无码喷水| 成人妇女免费播放久久久| 久久93精品国产91久久综合 | 2021国产精品久久精品| 国产精品一久久香蕉国产线看| 热re99久久精品国产99热| 中文无码久久精品| 久久亚洲国产成人精品无码区| 久久久久国产精品熟女影院| 色狠狠久久综合网| 国产精品99久久久久久www| 男女久久久国产一区二区三区| 久久精品无码一区二区日韩AV| 精品无码久久久久国产| 久久亚洲精品国产精品婷婷| 一级做a爰片久久毛片人呢| 蜜臀久久99精品久久久久久小说 | 久久精品国产精品亚洲精品| 国产精品久久久久aaaa| 亚洲精品无码久久一线| 亚洲国产精品一区二区三区久久 | 久久精品?ⅴ无码中文字幕| 久久久久久无码Av成人影院| 热99RE久久精品这里都是精品免费 | 久久久免费精品re6| 一本久久精品一区二区| 国产免费久久久久久无码| 热久久这里只有精品| 国产精品久久毛片完整版| 久久99精品久久久久久hb无码| 精品国产99久久久久久麻豆| 亚洲性久久久影院| 亚洲国产日韩综合久久精品| 亚洲人成无码久久电影网站| 久久久久这里只有精品| 四虎国产精品免费久久| 亚洲日本久久久午夜精品| 久久无码高潮喷水|