POJ 1141 Brackets Sequence(DP)

题目链接

很早 很早之前就看过的一题,今天终于A了。状态转移,还算好想,输出路径有些麻烦,搞了一个标记数组的,感觉不大对,一直wa,看到别人有写直接输出的。。二了,直接输出就过了。。

  1 #include <cstdio>

  2 #include <cstring>

  3 #include <iostream>

  4 using namespace std;

  5 int dp[201][201];

  6 int flag[201];

  7 int pos[201];

  8 char str[201];

  9 int dfs(int L,int R)

 10 {

 11     int i,minz;

 12     if(dp[L][R])

 13         return dp[L][R];

 14     if(L > R)

 15         return dp[L][R] = 0;

 16     if(L == R)

 17         return dp[L][R] = 2;

 18     if(str[L] == ']'||str[L] == ')')

 19         return dp[L][R] = 2 + dfs(L+1,R);

 20     minz = 100000;

 21     for(i = L; i <= R; i ++)

 22     {

 23         if(str[L] == '('&&str[i] == ')')

 24             minz = min(minz,2 + dfs(L+1,i-1) + dfs(i+1,R));

 25         else if(str[L] == '['&&str[i] == ']')

 26             minz = min(minz,2 + dfs(L+1,i-1) + dfs(i+1,R));

 27         else

 28             minz = min(minz,2 + dfs(L+1,i) + dfs(i+1,R));

 29     }

 30     return dp[L][R] = minz;

 31 }

 32 void find(int L,int R,int ans)

 33 {

 34     int i;

 35     if(L > R)

 36         return ;

 37     if(L == R)

 38     {

 39         if(str[L] == ')')

 40         printf("()");

 41         else if(str[L] == ']')

 42         printf("[]");

 43         else if(str[L] == '(')

 44         printf("()");

 45         else if(str[L] == '[')

 46         printf("[]");

 47         return ;

 48     }

 49     if(str[L] == ']'||str[L] == ')')

 50     {

 51         if(str[L] == ')')

 52         printf("()");

 53         else if(str[L] == ']')

 54         printf("[]");

 55         find(L+1,R,ans-2);

 56         return ;

 57     }

 58     for(i = L; i <= R; i ++)

 59     {

 60         if(str[L] == '('&&str[i] == ')')

 61         {

 62             if(ans == 2 + dp[L+1][i-1] + dp[i+1][R])

 63             {

 64                 printf("(");

 65                 find(L+1,i-1,dp[L+1][i-1]);

 66                 printf(")");

 67                 find(i+1,R,dp[i+1][R]);

 68                 return ;

 69             }

 70         }

 71         else if(str[L] == '['&&str[i] == ']')

 72         {

 73             if(ans == 2 + dp[L+1][i-1] + dp[i+1][R])

 74             {

 75                 printf("[");

 76                 find(L+1,i-1,dp[L+1][i-1]);

 77                 printf("]");

 78                 find(i+1,R,dp[i+1][R]);

 79                 return ;

 80             }

 81         }

 82         else if(str[L] == '[')

 83         {

 84             if(ans == 2 + dp[L+1][i] + dp[i+1][R])

 85             {

 86                 printf("[");

 87                 find(L+1,i,dp[L+1][i]);

 88                 printf("]");

 89                 find(i+1,R,dp[i+1][R]);

 90                 return ;

 91             }

 92         }

 93         else if(str[L] == '(')

 94         {

 95             if(ans == 2 + dp[L+1][i] + dp[i+1][R])

 96             {

 97                 printf("(");

 98                 find(L+1,i,dp[L+1][i]);

 99                 printf(")");

100                 find(i+1,R,dp[i+1][R]);

101                 return ;

102             }

103         }

104     }

105     return ;

106 }

107 int main()

108 {

109     int len,ans;

110     scanf("%s",str);

111     len = strlen(str);

112     ans = dfs(0,len-1);

113     find(0,len-1,ans);

114     printf("\n");

115     return 0;

116 }

 

 

你可能感兴趣的:(sequence)