POJ - 2955 区间dp
poj不支持bits/stdc++.h这个头文件就很坑,区间dp,第一重循环是长度,第二重是起点,第三重是遍历起点到终点
dp[i][j]代表i到j最大匹配数目,每次枚举了起点之后判断一下是否出现了()【】匹配
复杂度O(n^3)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define fi first #define se second #define mp make_pair #define pb push_back #define pii pair<int,int> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const double g=10.0,eps=1e-7; const int N=100+10,maxn=60000+10,inf=0x3f3f3f; int dp[N][N]; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; while(cin>>s) { if(s[0]=='e')break; int n=s.size(); memset(dp,0,sizeof dp); for(int len=2;len<=n;len++)//len { for(int i=0,j=len-1;j<n;i++,j++)//begin { 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][n-1]<<endl; } return 0; } /******************** ********************/