题目大意:括号匹配个数
思路:dp[i][j] 表示从i到j括号匹配的数量,那么如果i和j位置的括号匹配,则可以求得dp[i][j] = max(dp[i][j] , dp[i+1][j-1] + 2);然后从i到j枚举每一个位置,有dp[i][j] = max(dp[i][j] , dp[i][k] + dp[k][j]) ,另外,最外层的i循环需要从len到0,这样才能包含所有后面的情况。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 1010
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define INF 100000000
int dp[maxn][maxn];
string str;
char a[maxn];
int main()
{
while(scanf("%s" , a))
{
str = a;
int len = str.size();
if(str == "end") break;
mem(dp , 0);
for(int i = len - 1 ; i >= 0 ; i --)
{
for(int j = i ; j < len ; j ++)
{
if(str[i] == '(' && str[j] == ')' || str[i] == '[' && str[j] == ']')
dp[i][j] = max( 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][j]);
}
}
}
printf("%d\n" , dp[0][len-1]);
}
return 0;
}