codeforces 5C. Longest Regular Bracket Sequence(dp+栈)

题意:求出最长连续的规范括号序列,并求出长度和个数

方法一:利用栈与括号特性,来一发dp,本着一个左括号与一个右括号对应,是左括号就入栈,否则寻找栈中与其相匹配的并计算距离;

方法二:从左到右扫一遍,标记合法右括号,从右到左扫一遍,标记合法左括号。再对标记数组扫一遍,如果vis[i]=1;,ans++;

否则ans=1;(玄学正确性)

详看代码操作

dp AC代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stack>
using namespace std;
const int maxn=1e6+10;
int dp[maxn];
stack<int>s;
int main()
{
	string st;
	cin>>st;
	memset(dp,0,sizeof(dp));
	for (int i=0;i<st.length();i++)
	{
		if (st[i]=='(')
			s.push(i);
		else
		{
			if (!s.empty())	
			{
				int po=s.top();
				s.pop();
				if (po)
					dp[i]=dp[po-1]+(i-po+1);
				else 
					dp[i]=dp[0]+(i-po+1);
			}
		}	
	}
	int maxx=0,cnt=0;
	for (int i=0;i<st.length();i++)
	{
		if (dp[i]>maxx)
		{
			maxx=dp[i];
			cnt=1;
		}
		else if (dp[i]==maxx) 
			cnt++;
	}
	if (maxx==0)
		cout<<"0"<<" "<<"1"<<endl;
	else 
		cout<<maxx<<" "<<cnt<<endl;
		
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值