思路
经典区间 d p dp dp 转移方式题目已经给了
考虑
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 表示在
[
i
,
j
]
[i,j]
[i,j] 区间内可以匹配的括号对的数量
状态转移
f
[
i
]
[
j
]
=
f
[
i
+
1
]
[
j
−
1
]
+
c
h
e
c
k
(
i
,
j
)
;
f[i][j] = f[i+1][j-1] + check(i,j);
f[i][j]=f[i+1][j−1]+check(i,j);
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
)
;
f[i][j] = max(f[i][j],f[i][k]+f[k+1][j]);
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);
代码
int f[110][110];
string s;
bool chk(int i,int j){
if((s[i] == '[' && s[j] == ']')||(s[i]=='(' && s[j]==')')) return true;
return false;
}
signed main()
{
while(cin >> s){
if(s == "end") break;
mem(f,0);
int le = s.size();
forr(len,2,le){
for(int i = 0;i+len-1<le;i++){
int j = i+len-1;
f[i][j] = f[i+1][j-1]+chk(i,j);
for(int k = i;k<j;k++) f[i][j] = max(f[i][j],f[i][k]+f[k+1][j]);
}
}
cout << f[0][le-1]*2 << endl;
}
return 0;