zoukankan      html  css  js  c++  java
  • 【算法•日更•第八期】区间动态规划:1572:括号配对题解

      废话不多说,直接上题:


      题目测评链接:戳这里

      其实什么GBE都没用,小编最开始看了半天不懂,看了看别人的博客才知道这段话没什么用处。其实就是给一段字符串,判断是否括号是配对的。

      这道题一看就会想到区间动态规划(不会戳这里临时补一补),最开始先老老实实地写了一遍区间动态规划,后来觉得用栈也可以,于是写了一遍,代码如下:

     1 #include<iostream>
     2 #include<cstring>
     3 #include<stack>
     4 using namespace std;
     5 string s;int n,wrong;
     6 stack<int>a;
     7 int main()
     8 {
     9     cin>>s;
    10     n=s.length();
    11     for(int i=0;i<n;i++)
    12     {
    13         if(s[i]=='(') a.push(1);
    14         else if(s[i]==')') 
    15         {
    16             if(!a.empty())
    17             {
    18                 if(a.top()==1) a.pop();
    19                 else wrong++;
    20             }
    21             else wrong++;
    22         }
    23         else if(s[i]=='[') a.push(2);
    24         else if(s[i]==']') 
    25         {
    26             if(!a.empty())
    27             {
    28                 if(a.top()==2) a.pop();
    29                 else wrong++;
    30             }
    31             else wrong++;
    32         }
    33     }
    34     cout<<wrong;
    35     return 0;
    36 }

      想法很简单,检测到或 时,就判断是否能配对,如果不行,就记录下这个错误。

      样例很快就过了,但是测评时错了4个测试点,检查了一下,才发现了一些bug,比如输入([)]期望得到4,而只得到了1。所以还是老老实实用区间动态规划吧。

      首先思考一个问题:需要补上的括号数=没有成功配对的括号数=总括号数-能正确配对的括号数。

      所以,我们不妨这样设计状态:用f[i][j]表示ij区间内能配对成功的括号数。

      那么f[i][j]怎么转移呢?如果用s数组来表示字符串,那么如果s[i]==s[j],那么就有f[i][j]=f[i+1][j-1]+2。可能有点难理解,图解一下:

      

      那么这是s[i]==s[j]时的操作(难点),剩下的就是老套路了,f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])

      代码很简单,就不加注释了。

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 string s;int n,f[1000][1000];
     5 int main()
     6 {
     7     cin>>s;
     8     n=s.length();
     9     for(int t=1;t<=n-1;t++)
    10     for(int i=0;i<n-t;i++)
    11     {
    12         int j=i+t;
    13         if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']')) f[i][j]=f[i+1][j-1]+2;
    14         for(int k=i;k<j;k++)
    15         f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
    16     }
    17     cout<<n-f[0][n-1];
    18     return 0;
    19 }
  • 相关阅读:
    PAT 甲级 1115 Counting Nodes in a BST (30 分)
    PAT 甲级 1114 Family Property (25 分)
    PAT 甲级 1114 Family Property (25 分)
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
    Python Ethical Hacking
  • 原文地址:https://www.cnblogs.com/TFLS-gzr/p/11169538.html
Copyright © 2011-2022 走看看