经典问题了,但还是不会写
题目链接
直接设dp[i]为以i结尾的最长匹配序列
那么显然只有在si为)或]时才能作为结尾
那么令dp[i−1]=x,表示[i−x,i−1]是一个合法得括号序列
所以要求si−x−1和si能互相匹配才行,就可以在原基础上加2
dp[i]=dp[i−1]+2
慢着!!!
其实是dp[i]=dp[i−1]+2+dp[i−x−2]
因为暂时我们知道[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];
}