比赛好难啊,做动态规划的题目压压惊
还好这个题是放在动态规划的专题里,不然就当模拟题来做了
其实模拟之类的也可以吧应该,计数器好好维护应该也可以做,不过我就没想了
一开始只知道要用栈结构来处理这些括号,不知道怎么dp做,后来瞄了一眼学长的dp方程,豁然开朗啊,
智商果然是硬伤
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int dp[1000005];
char s[1000005];
int main()
{
while(~scanf("%s",s+1))
{
int nmax=0,cnt=0;
stack<int>l;
memset(dp,0,sizeof dp);
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='(')
l.push(i);
else if(s[i]==')'&&!l.empty())
{
int temp=l.top();
l.pop();
dp[i]=dp[temp-1]+i-temp+1; //在前一个左括号的左边,如果也是左括号,那dp[temp-1]自然就是0,如果是右括号,那么dp[temp-1]存的就 是这个右括号与之前字符串匹配的值,这样就dp一波过去了
if(dp[i]>nmax)
{
cnt=1;
nmax=dp[i];
}
else if(dp[i]==nmax)
cnt++;
}
}
if(!nmax)
cnt=1;
printf("%d %d",nmax,cnt);
}
return 0;
}