poj1141Brackets Sequence(dp+路径)

链接

dp好想  根据它定义的 记忆化下就行 

路径再dfs一遍 刚开始以为要判空格 所以加了判空格的代码 后来知道不用 。。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 using namespace std;
  7 #define INF 0xffffff
  8 int dp[110][110];
  9 char s[110],q[550];
 10 int dfs(int a,int b)
 11 {
 12     int i,d1,d2 = INF;
 13     if(dp[a][b]!=-1)
 14     return dp[a][b];
 15     if(a==b)
 16     return dp[a][b] = 1;
 17     if(a>b)
 18     return dp[a][b] = 0;
 19     if(s[a]==q[s[b]])
 20     d1 = dfs(a+1,b-1);
 21     else
 22     {
 23         int x,y;
 24         x = dfs(a+1,b)+1;
 25         y = dfs(a,b-1)+1;
 26         d1 = min(x,y);
 27     }
 28     for(i = a ; i < b ; i++)
 29     d2 = min(d2,dfs(a,i)+dfs(i+1,b));
 30     dp[a][b] = min(d1,d2);
 31     return dp[a][b];
 32 }
 33 void find(int a,int b)
 34 {
 35     int i;
 36     if(a==b)
 37     {
 38         if(s[a]=='('||s[a]==')')
 39         printf("()");
 40         else if(s[b]=='['||s[a]==']')
 41         printf("[]");
 42         return ;
 43     }
 44     if(a>b)
 45     return ;
 46     if(s[a]==q[s[b]]&&dp[a][b]==dp[a+1][b-1])
 47     {
 48         if(s[a]=='(')
 49         {
 50             printf("(");
 51             find(a+1,b-1);
 52             printf(")");
 53         }
 54         else if(s[a]=='[')
 55         {
 56             printf("[");
 57             find(a+1,b-1);
 58             printf("]");
 59         }
 60     }
 61     else
 62     if(dp[a][b]==(dp[a+1][b]+1))
 63     {
 64         if(s[a]=='('||s[a]==')')
 65         printf("()");
 66         else if(s[a]=='['||s[a]==']')
 67         printf("[]");
 68         find(a+1,b);
 69     }
 70     else
 71     if(dp[a][b]==dp[a][b-1]+1)
 72     {
 73         find(a,b-1);
 74         if(s[b]=='('||s[b]==')')
 75         printf("()");
 76         else if(s[b]=='['||s[b]==']')
 77         printf("[]");
 78     }
 79     else
 80     {
 81         for(i = a ; i < b ; i++)
 82         {
 83             if(dp[a][b]==dp[a][i]+dp[i+1][b])
 84             {
 85                 find(a,i);
 86                 find(i+1,b);
 87                 break;
 88             }
 89         }
 90     }
 91 }
 92 int main()
 93 {
 94     int k;
 95     q[')'] = '(';
 96     q[']'] = '[';
 97     //q[' '] = ' ';
 98     while(gets(s)!=NULL)
 99     {
100         memset(dp,-1,sizeof(dp));
101         k = strlen(s);
102         int ans = dfs(0,k-1);
103         find(0,k-1);
104         puts("");
105     }
106     return 0;
107 }
View Code

 

 

posted @ 2013-08-31 21:27  _雨  阅读(178)  评论(0编辑  收藏  举报