zoukankan      html  css  js  c++  java
  • poj 2955 Brackets 括号匹配 区间dp

    题意:最多有多少括号匹配

    思路:区间dp,模板dp,区间合并。

    对于a[j]来说:

    刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+2), a[k]与a[j] 匹配,结果一组数据出错

    ([]])
      检查的时候发现dp[2][3]==2,对,dp[2][4]=4,错了,简单模拟了一下发现,dp[2][4]=dp[2][1]+dp[2][3]+2==4,错了

    此时2与4已经匹配,2与3已经无法再匹配。

    故转移方程改为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k+1][j-1]+2)。a[k]放弃使用,幸运的一次ac

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    char a[110];
    int dp[110][110];
    int main()
    {
        while(scanf("%s",a+1)!=EOF)
        {
            int lena=strlen(a+1);
            int i,j,k;
            if(lena==3&&a[1]=='e'&&a[2]=='n'&&a[3]=='d')
            {
                break;
            }
           //cout<<"lena== "<<lena<<endl;
            memset(dp,0,sizeof(dp));
            for(i=lena-1;i>=1;i--)
            {
                for(j=i+1;j<=lena;j++)
                {
                    dp[i][j]=dp[i][j-1];
                    for(k=i;k<=j-1;k++)
                    {
                        if((a[k]=='('&&a[j]==')')||(a[k]=='['&&a[j]==']'))
                        {
                            dp[i][j]=max(dp[i][k-1]+dp[k+1][j-1]+2,dp[i][j]);
                        }
                    }
                     //cout<<"i== "<<i<<"    j== "<<j<<"  dp[i][j]== "<<dp[i][j]<<endl;
                }
            }
            cout<<dp[1][lena]<<endl;
        }
        return 0;
    }
    





  • 相关阅读:
    java中 == 与equals 的区别
    java中的多线程 // 基础
    MySQL-锁机制
    将博客搬至CSDN
    MySQL-事务
    MySQL-存储过程
    MySQL-触发器
    MySQL-视图
    Redis设置Auth认证保护
    PHP目前常见的五大运行模式
  • 原文地址:https://www.cnblogs.com/llguanli/p/7397526.html
Copyright © 2011-2022 走看看