Brackets
题意&分析:
求匹配括号的最大数目,一对括号匹配算两个括号(<–废话)。
典型的区间dp求法。
代码如下:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define TEST cout<<"stop here"<<endl
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
int dp[110][110];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
string s;
while(cin>>s && s[0]!='e'){
int len = s.size();
memset(dp,0,sizeof(dp));
for(int d=1;d<len;d++){
for(int i=0,j=d;j<len;i++,j++){
if((s[i]=='('&&s[j]==')') || (s[i]=='['&&s[j]==']'))
dp[i][j] = dp[i+1][j-1] + 2;
for(int k=i;k<=j;k++)
dp[i][j] = max(dp[i][j],dp[i][k] + dp[k+1][j]);
}
}
cout<< dp[0][len-1] <<endl;
s.clear();
}
return 0;
}
参考资料: