P1944 最长括号匹配dp( O(n)解法)

经典问题了,但还是不会写

题目链接

d p [ i ] i 直接设dp[i]为以i结尾的最长匹配序列

s i ) ] 那么显然只有在s_i为)或]时才能作为结尾

d p [ i 1 ] = x , [ i x , i 1 ] 那么令dp[i-1]=x,表示[i-x,i-1]是一个合法得括号序列

s i x 1 s i , 2 所以要求s_{i-x-1}和s_i能互相匹配才行,就可以在原基础上加2

d p [ i ] = d p [ i 1 ] + 2 dp[i]=dp[i-1]+2

! ! ! \color{Red}慢着!!!

d p [ i ] = d p [ i 1 ] + 2 + d p [ i x 2 ] 其实是dp[i]=dp[i-1]+2+dp[i-x-2]

[ i x 1 , i ] , 因为暂时我们知道[i-x-1,i]是合法得,前面可能还可以继续匹配

总之这个dp非常喵喵喵呀

#include <bits/stdc++.h>
using namespace std;
int  maxx,num,n,m,dp[1000009];
char s[1000009];
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=1;i<=n;i++)
	{
		int x=dp[i-1];
		if( (s[i]==')'&&s[i-x-1]=='(') || (s[i]==']'&&s[i-x-1]=='[') )
		{
			dp[i]=dp[i-1]+2+dp[i-x-2];
			if( dp[i]>maxx )	maxx=dp[i],num=i;
		}
	}
	for(int i=num-dp[num]+1;i<=num;i++)
		cout<<s[i];
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107465629