我们知道一个的是0,因此先初始化两个长度的时候
之后运用区间dp的思想,如果s[l]和s[r]满足是一对,那么先由内部更新
之后我们枚举断点,计算相加的情况
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<string> #include<cstring> #include<map> #include<set> using namespace std; typedef long long ll; const int N=1e5+10; const int inf=0x3f3f3f3f; int f[110][110]; int main(){ string s; while(cin>>s){ if(s=="end") break; int i,j; s=" "+s; memset(f,0,sizeof f); int len,l,r; for(i=1;i<=s.size()-1;i++){ if(s[i]==‘(‘&&s[i+1]==‘)‘||(s[i]==‘[‘&&s[i+1]==‘]‘)) f[i][i+1]=2; } for(len=3;len<=s.size();len++){ for(l=1;l+len-1<=s.size();l++){ r=l+len-1; if(s[l]==‘(‘&&s[r]==‘)‘||(s[l]==‘[‘&&s[r]==‘]‘)){ f[l][r]=max(f[l][r],f[l+1][r-1]+2); } for(int k=l;k<r;k++){ f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]); } } } cout<<f[1][s.size()]<<endl; } }
原文地址:https://www.cnblogs.com/ctyakwf/p/12326562.html
时间: 2024-11-05 15:58:43