• <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年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            導航

            統計

            公告

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

            常用鏈接

            留言簿(6)

            隨筆檔案

            相冊

            搜索

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久曰本AV免费免费| 77777亚洲午夜久久多人| 久久青青草原综合伊人| 久久综合九色综合97_久久久| 嫩草伊人久久精品少妇AV| 99久久这里只有精品| 国产精品热久久无码av| 久久久久久久精品成人热色戒 | 久久精品国产91久久麻豆自制| 久久精品国产99久久久| 曰曰摸天天摸人人看久久久| 久久综合精品国产一区二区三区| 婷婷久久综合九色综合九七| 色综合久久久久久久久五月| 久久这里只有精品久久| 亚洲欧美国产精品专区久久| 久久人人爽爽爽人久久久| 国产ww久久久久久久久久| 精品国产乱码久久久久久人妻| 久久亚洲高清观看| 亚洲va久久久噜噜噜久久男同| 国产成人99久久亚洲综合精品 | 精品国产91久久久久久久| 日韩精品久久久久久久电影| 久久99精品久久久久久| 久久精品中文无码资源站| 很黄很污的网站久久mimi色| 久久久亚洲欧洲日产国码二区| 亚洲国产成人乱码精品女人久久久不卡 | 久久久一本精品99久久精品66| 久久亚洲国产精品五月天婷| 91精品国产高清久久久久久io | 国产精品99久久久精品无码| 久久久久亚洲av成人无码电影| 久久99精品综合国产首页| 久久久久99精品成人片直播| 97精品伊人久久大香线蕉| 久久久久久久亚洲精品| 久久精品国产99国产精偷| 国产亚洲欧美精品久久久| 日韩人妻无码精品久久免费一 |