区间dp模型之括号匹配打印路径 poj(1141)

小咪咪 2022-08-26 15:27 236阅读 0赞

题目链接:Brackets Sequence

题目描述:给出一串由‘(‘)’‘ [ ‘ ‘ ] ‘组成的串,让你输出添加最少括号之后使得括号匹配的串。

分析:是区间dp的经典模型括号匹配。讲解:http://blog.csdn.net/y990041769/article/details/24194605 ,难点在于要把匹配后的括号输出来。

首先我们知道前面定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目

那么假如我们知道任意 i 到 j 从哪儿插入分点使得匹配添加括号最少。那么我们定义pos【i】【j】表示 i 到 j 从哪儿分开使得匹配添加括号最少,如果i和j匹配我们可以让pos【i】【j】=-1;

我们发现在我们之前更新dp [ i ] [ j ] 的时候如果中间点k使得if ( dp [ i ] [ k ] + dp [ k+1 ] [ j ] >= dp [ i ] [ j ] ) ,那么我们从k分开可以让添加的括号最少。

但是还要注意一点,考虑所有的都不匹配如“((((”这类,考虑怎么处理,然后就可以递归输出结果。

这题目坑了我很多次,刚开始Tel,发现全部不匹配不能处理,改了之后wa了。发现输入“()(()”,输出的是“(()()())”,明显错误,是在处理的时候没处理好,最后注意输入会有空串。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. const int N = 120;
  7. int dp[N][N],pos[N][N]; ///i到j从哪个位置分开添加的括号数最少
  8. char s[N];
  9. void show(int i,int j)
  10. {
  11. if(i>j) return;
  12. if(i==j)
  13. {
  14. if(s[i]=='('||s[i]==')') cout<<"()";
  15. else cout<<"[]";
  16. }
  17. else
  18. {
  19. if(pos[i][j]==-1)
  20. {
  21. cout<<s[i];
  22. show(i+1,j-1);
  23. cout<<s[j];
  24. }
  25. else
  26. {
  27. show(i,pos[i][j]);
  28. show(pos[i][j]+1,j);
  29. }
  30. }
  31. }
  32. int main()
  33. {
  34. while(gets(s))
  35. {
  36. memset(dp,0,sizeof(dp));
  37. int len=strlen(s);
  38. for(int i=1; i<len; i++)
  39. {
  40. for(int j=0,k=i; k<len; j++,k++)
  41. {
  42. if(s[j]=='('&&s[k]==')' || s[j]=='['&&s[k]==']')
  43. {
  44. dp[j][k]=dp[j+1][k-1]+2;
  45. pos[j][k]=-1;
  46. }
  47. for(int f=j; f<k; f++)
  48. {
  49. if(dp[j][f]+dp[f+1][k]>=dp[j][k]) ///注意这里 保证所有都不匹配也能够分
  50. {
  51. dp[j][k]=dp[j][f]+dp[f+1][k];
  52. pos[j][k]=f;
  53. }
  54. }
  55. }
  56. }
  57. //cout<<s.size()-dp[0][s.size()-1]<<endl;
  58. show(0,len-1);cout<<endl;
  59. }
  60. return 0;
  61. }

发表评论

表情:
评论列表 (有 0 条评论,236人围观)

还没有评论,来说两句吧...

相关阅读

    相关 poj 2253(区间DP

    [原题][Link 1] 思路:求所有路径中最大跳跃距离的最小值, 很诡异的是输出答案如果用G++,.3lf%格式会出错,c++可以过 include<cstdio

    相关 POJ1179 Polygon(区间dp

    题意:多边形游戏是一个单人玩的游戏,开始时有一个由n个顶点构成的多边形。每个顶点被赋予一个整数值,每条边被赋予一个运算符“+”或“\”。所有边依次用整数从1到n编号,游戏第1