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("
");
115     return 0;
116 }
原文地址:https://www.cnblogs.com/naix-x/p/3293426.html