zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    0719PHP基础:PDO
    0717PHP基础:面向对象
    0716PHP基础:面向对象
    0715JS基础:ajax
    0715PHP练习:文件操作
    0715PHP基础:文件操作
    0629正则表达式:基础
    0628正则表达式:练习
    zTree简单使用和代码结构
    servlet
  • 原文地址:https://www.cnblogs.com/naix-x/p/3293426.html
Copyright © 2011-2022 走看看