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

 

 

你可能感兴趣的:(sequence)