• <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 動態規劃

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

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

            兩個思路;

            思路一:
            int num[i][j]表示第i個字符到第j個字符需要添加的最少字符數。string after[i][j]表示操作后,第i個字符到第j個字符按照最優方案添加括號后的串。
            輸出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) //合并字符串的函數 

            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里的數據都通不過。而且我char *after[][]是三維數組,太不方便了,代碼看起來很亂,很不爽。
            想起學C語言時候,判斷括號匹配時用的是遞歸。那能不能在查找匹配時也用遞歸呢? 于是有了思路二。
                 

            思路二:
                int opt[i,j]表示第i個字符到第j個字符需要添加的最少字符數,狀態轉移方程: 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]所需要插入的最小字符數

            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],繼續搜索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]可以配對,問題轉化為求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 流牛ζ木馬 閱讀(1316) 評論(2)  編輯 收藏 引用

            評論

            # re: ACM PKU 1411 Brackets Sequence 動態規劃 2007-11-24 13:40 大隱于市

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

            # re: ACM PKU 1411 Brackets Sequence 動態規劃 2009-09-17 23:33 solofancy

            第二個WA吧  回復  更多評論   

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

            導航

            統計

            公告

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

            常用鏈接

            留言簿(6)

            隨筆檔案

            相冊

            搜索

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产精品青草| 国产毛片久久久久久国产毛片| 日日噜噜夜夜狠狠久久丁香五月| 97久久精品无码一区二区天美| 久久91精品综合国产首页| 久久久久国产精品人妻| 亚洲国产成人久久综合碰碰动漫3d| 久久高潮一级毛片免费| 久久精品国产久精国产思思| 国内精品久久久久久久久电影网| 无码AV波多野结衣久久| 91久久国产视频| 久久综合九色综合网站 | 韩国三级大全久久网站| 四虎影视久久久免费| 精品国产乱码久久久久久郑州公司| 久久久久久久综合日本| 精品久久久久久无码中文字幕一区| 久久婷婷色香五月综合激情 | 国产免费久久精品99久久| 少妇久久久久久被弄高潮| 久久伊人五月天论坛| 久久99国产精品久久99果冻传媒| 久久精品亚洲AV久久久无码| 久久久精品国产Sm最大网站| 一级做a爰片久久毛片16| 97久久国产亚洲精品超碰热| 亚洲国产精品无码久久久不卡| 亚洲精品无码久久毛片| 精品99久久aaa一级毛片| 国产成人精品久久亚洲| 99久久精品九九亚洲精品| 久久综合欧美成人| 99久久国产亚洲高清观看2024 | 精品永久久福利一区二区| 久久久久精品国产亚洲AV无码| 亚洲人AV永久一区二区三区久久| 激情五月综合综合久久69| 久久久久这里只有精品| 亚洲乱码日产精品a级毛片久久 | 久久久久久青草大香综合精品|