zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    学号 20172328 《程序设计与数据结构》第八周学习总结
    172328 结对编程练习_四则运算 第一周 阶段总结
    学号 20172328 《程序设计与数据结构》实验二报告
    20172328《程序设计与数据结构》第七周学习总结
    Educoder
    Educoder
    Educoder
    Educoder
    Educoder
    Educoder
  • 原文地址:https://www.cnblogs.com/shangyu/p/3293528.html
Copyright © 2011-2022 走看看