pku 1141 Bracket Sequence DP 解题报告

pku 1141 Bracket Sequence DP 解题报告

以前做过的十分典型DP.黑书有这题的思路.关键是明白是最优子结构。

#include <string>

#include <iostream>

using namespace std;

#define min(a, b) a > b ? b : a

 

int len;

int d[110][110];

char s[110], result[110];

string ans[110][110];

 

int main()

{

       int i, j, k, p, len;

       scanf("%s", s + 1);

       len = strlen(s + 1);

       for (i = 1; i <= len; i++)

       {

              d[i][i] = 1;

              if (s[i] == '(')

              {

                     ans[i][i] = "()";

              }

              else if (s[i] == ')')

              {

                     ans[i][i] = "()";

              }

              else if (s[i] == '[')

              {

                     ans[i][i] = "[]";

              }

              else if (s[i] == ']')

              {

                     ans[i][i] = "[]";

              }

       }     

       //d[i,j]表示从位置i到位置j所需要插入的最小字符数

       //ans[i,j]则存储最优字符串内容

      for (p = 1; p <= len - 1; p++)

       {

              for (i = 1; i <= len - p; i++)

              {

                     j = i + p;

                     d[i][j] = 110;

                     if (s[i] == '(' && s[j] == ')')

                     {

                            if (d[i + 1][j - 1] < d[i][j])

                            {

                                   d[i][j] = d[i + 1][j - 1];

                                   ans[i][j] = '(' + ans[i + 1][j - 1] + ')';

                            }

                     }            

                     else if (s[i] == '[' && s[j] == ']')

                     {

                            if (d[i + 1][j - 1] < d[i][j])

                            {

                                   d[i][j] = d[i + 1][j - 1];

                                   ans[i][j] = '[' + ans[i + 1][j - 1] + ']';

                            }

                     }     

                     for (k = i; k <= j - 1; k++)

                     {

                            if (d[i][k] + d[k + 1][j] < d[i][j])

                            {

                                   //最优子结构:d[i][j]=min(d[i][j], d[i][k]+d[k+1][j])

                                   d[i][j] = d[i][k] + d[k + 1][j];

                                   ans[i][j] = ans[i][k] + ans[k + 1][j];

                            }

                     }

              }

       }

       cout << ans[1][len] << endl;

       return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值