zoukankan      html  css  js  c++  java
  • NYOJ-15:括号匹配(二)

    内存限制:64MB 时间限制:1000ms 特判: No

    通过数:54 提交数:158 难度:6

    题目描述:

    给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
    如:
    []是匹配的
    ([])[]是匹配的
    ((]是不匹配的
    ([)]是不匹配的

    输入描述:

    第一行输入一个正整数N,表示测试数据组数(N<=10)
    每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100

    输出描述:

    对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
    样例输入:
    4
    []
    ([])[]
    ((]
    ([)]
    样例输出:
    0
    0
    3
    2

    思路

    dp[i][j]dp[i][j]储存iijj位置需要添加括号的数量
    因为要找最小的次数,所以给dp[i][j]dp[i][j]的初始值可以设为字符串的长度(足够大就可以),当i=ji=j的时候,至多需要11个括号就能匹配了,所以初始值为11
    如果当前iijj位置的括号可以匹配,那么[i,j][i,j]之间需要的括号数和[i+1,j1][i+1,j-1]的相同,所以dp[i][j]=dp[i+1][j1]dp[i][j]=dp[i+1][j-1]
    然后查询[i,j][i,j]之间需要的最少括号数,dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

    AC代码

    /*************************************************************************
        > File Name: 15.cpp
        > Author: WZY
        > School: HPU 
        > Created Time: 2019年01月21日 15:18:59
     ************************************************************************/
    #include<bits/stdc++.h>
    #define ll long long
    #define ull unsigned long long
    #define ms(a,b) memset(a,b,sizeof(a))
    #define pi acos(-1.0)
    #define INF 0x7f7f7f7f
    const double E=exp(1);
    const int maxn=1e3+10;
    const int mod=1e9+7;
    using namespace std;
    char ch[maxn];
    // dp[i][j]表示从i到j位置匹配所需要添加的括号数
    int dp[maxn][maxn];
    bool check(char a,char b)
    {
    	if((a=='['&&b==']')||(a=='('&&b==')'))
    		return true;
    	else
    		return false;
    }
    int main(int argc, char const *argv[])
    {
    	ios::sync_with_stdio(false);
    	int t;
    	cin>>t;
    	while(t--)
    	{
    		cin>>ch;
    		int l=strlen(ch);
    		for(int i=0;i<l;i++)
    		{
    			dp[i][i]=1;
    			dp[i+1][i]=0;
    		}
    		for(int i=l-2;i>=0;i--)
    		{
    			for(int j=i+1;j<l;j++)
    			{
    				dp[i][j]=l;
    				if(check(ch[i],ch[j]))
    					dp[i][j]=dp[i+1][j-1];
    				for(int k=i;k<j;k++)
    					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
    			}
    		}
    		cout<<dp[0][l-1]<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Android学习——SAX解析方式
    Android学习——pull解析方式
    Android学习——使用okhttp
    开课第十五周周总结
    顶会热词3
    顶会热词2
    顶会热词1
    配置JAVA环境
    配置mybaits的一些坑
    Maven配置和idea种tomcat配置的一些坑点
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324306.html
Copyright © 2011-2022 走看看